名 前
strftime − 日 付 お よ び 時 刻 の 文 字 列 へ の 変 換
書 式
#include <time.h>
size_t
strftime(char *s, size_t max,
const char *format,
const struct tm *tm);
説 明
strftime() 関 数 は 、 要 素 別 の 時 刻 tm の 内 容 を format で 指 定 さ れ た 書 式 指 定 に し た が っ て 変 換 し 、 長 さ max の 文 字 列 s に 書 き 込 む 。 書 式 指 定 は ヌ ル 終 端 さ れ た 文 字 列 で あ り 、 「 変 換 指 定 (conversion specification)」 と 呼 ば れ る 特 別 な 文 字 列 を 含 ま る こ と が で き る 。 各 々 の 変 換 指 定 は '%' 文 字 で 始 ま り 、 「 変 換 指 定 文 字 (conversion specifier character)」 と 呼 ば れ る 何 ら か 他 の 文 字 で 終 端 さ れ る 。 上 記 以 外 の 全 て の 文 字 列 は 「 通 常 の 文 字 列 (ordinary character sequence)」 と な る 。
(NULL バ イ ト も 含 む ) 通 常 の 文 字 列 内 の 文 字 は 、 そ の ま ま format か ら s に コ ピ ー さ れ る 。 一 方 、 変 換 指 定 の 文 字 は 以 下 の よ う に 置 換 さ れ る 。
%a 現 在 の ロ ケ ー ル に お け る 曜 日 の 省 略 名 。
%A 現 在 の ロ ケ ー ル に お け る 曜 日 の 完 全 な 名 前 。
%b 現 在 の ロ ケ ー ル に お け る 月 の 省 略 名 。
%B 現 在 の ロ ケ ー ル に お け る 月 の 完 全 な 名 前 。
%c 現 在 の ロ ケ ー ル に お い て 一 般 的 な 日 付 ・ 時 刻 の 表 記 。
%C 世 紀
(西 暦 年 の 上 2 桁 )。 (SU)
%d 月 内 通 算 日
(10 進 数 表 記 ) (01−31)。
%D
%m/%d/%y と 等 価 。 (う え っ 、 ア メ リ カ 専 用 だ 。 ア メ リ カ 以 外 の 国 で は %d/%m/%y の 方 が 一 般 的 だ 。 紛 ら わ し い の で 、 使 用 す べ き で は な い 。 ) (SU)
%e
%d と 同 様 に 月 内 通 算 日 を 10 進 数 で 表 現 す る が 、 1 桁 の 場 合 10 の 位 に ゼ ロ を 置 か ず ス ペ ー ス を 置 く 。 (SU)
%E
別 形 式
を 使 用 す る 際
の 修 飾 子 。 下
記 参 照 。 (SU)
%F
%Y−%m−%d と 等 価 (ISO 8601 形 式 の 日 付 フ ォ ー マ ッ ト )。 (C99)
%G
ISO 8601 週 単 位 表 記 の 年 (week−based year; 「 注 意 」 の 節 を 参 照 )。 世 紀 も 10 進 数 で 表 す 。 ISO 週 番 号 (%V を 参 照 ) に 対 応 し た 4 桁 の 西 暦 年 。 こ れ は 基 本 的 に は %Y と 同 じ 形 式 だ が 、 ISO 週 数 が 前 年 や 翌 年 に な る 場 合 に は そ の 年 が 使 用 さ れ る 点 が 異 な る 。 (TZ)
%g
%G と 同 様 。 但 し 、 世 紀 を 含 ま ず 下 2 桁 の み を 表 示 (00−99)。 (TZ)
%h
%b と 等 価 (SU)
%H
24 時 間 表 記 で の 時 (hour)。 (00−23)
%I
12 時 間 表 記 で の 時 (hour)。 (01−12)
%j
年 の 初
め か ら 通 算 の
日 数 。 (001−366)
%k
24 時 間 表 記 で の 時 (0−23)。 1 桁 の 場 合 に は 前 に ゼ ロ で な く ス ペ ー ス が 置 か れ る 。 (%H も 参 照 ) (TZ)
%l
12 時 間 表 記 で の 時 (0−12)。 1 桁 の 場 合 に は 前 に ゼ ロ で な く ス ペ ー ス が 置 か れ る 。 (%I も 参 照 ) (TZ)
%m
月 (10 進 数
表 記 )。 (01−12)
%M 分 (10 進 数 表 記 )
(00−59)
%n 改 行
。 (SU)
%O 別 形 式 を
使 用 す る 際 の 修 飾 子 。 下 記 参 照 。 (SU)
%p 現 在 の ロ ケ ー ル に お け る 「 午 前 」 「 午 後 」 に
相 当 す
る 文 字 列 。 英
語 の 場 合 に は
"AM" ま た は "PM"
と な る 。 正 午
は 「 午 後 」 、
真 夜 中 は 「 午
前 」 と し て 扱
わ れ る 。
%P
%p と 同 様 で あ る が 小 文 字 が 使 用 さ れ る 。 英 語 の 場 合 に は "am" や "pm" と な る 。 (GNU)
%r
午 前 ・
午 後 形 式 で の
時 刻 。 POSIX ロ ケ ー
ル で は %I:%M:%S %p と
等 価 で あ る 。 (SU)
%R
24 時 間 表 記 で の 時 刻 、 秒 は 表 示 し な い (%H:%M)。 秒 を 含 ん だ も の は 以 下 の %T を 参 照 す る こ と 。 (SU)
%s
紀 元 (Epoch;
1970−01−01 00:00:00 +0000 (UTC)) か
ら の 秒 数 。 (TZ)
%S 秒 (10 進 数 表 記 )
(00−60) (時 々 あ る 閏
秒 に 対 応 す る
た め 、 値 の 範
囲
は 60 ま で と な っ て い る )
%t タ ブ 文 字
(SU)
%T
24 時 間 表 記 の 時 間 (%H:%M:%S) (SU)
%u 週 の 何 番 目 の 日
(10 進 数 表 記 ) か 。 月 曜 日 を 1 と す る (1−7)。 %w も
参 照 。 (SU)
%U 年 の 初 め か ら の 通 算 の 週 番 号
(10 進 数 表 記 ) (00−53)。 そ の 年 の 最 初
の 日 曜 日 を 、 第 1 週 の 始 ま り と し て 計 算 す る 。 %V と %W も 参 照 す る こ と 。
%V
ISO 8601 形 式 で の 年 の 始 め か ら の 週 番 号 (「 注 意 」 の 節 を 参 照 )。 10 進 数 表 記 で 、 01 か ら 53 の 値 と な る 。 週 番 号 は 、 新 し い 年 が 少 な く と も 4 日 以 上 含 ま れ る 最 初 の 週 を 1 と し て 計 算 す る 。 %U と %W も 参 照 の こ と 。 (SU)
%w
週 の 何 番 目 の 日 (10 進 数 表 記 ) か 。 日 曜 日 を 0 と す る 。 (0−6)。 %u も 参 照 。 (SU)
%W
年 の 初
め か ら の 通 算
の 週 番 号 (10 進 数
表 記 ) (00−53)。 そ の
年 の 最 初 の 月
曜 日 を 、 第 1 週
の 始 ま り と し
て 計 算 す る 。
%x
現 在 の ロ ケ ー ル で 一 般 的 な 日 付 表 記 。 時 刻 は 含 ま な い 。
%X 現 在 の ロ ケ ー ル で 一 般 的 な 時 刻 表 記 。 日 付 は 含 ま な い 。
%y 西 暦 の 下
2桁 (世 紀 部 分 を 含 ま な い 年 ) (00−99)。
%Y 世 紀 部 分 を 含 め た
( 4 桁 の ) 西 暦 年 。
%z
+hhmm や −hhmm の 形 式 の タ イ ム ゾ ー ン (UTC へ の オ フ セ ッ ト 時 間 )。 (SU)
%Z タ イ ム ゾ ー ン 名 ま た は 省 略 名 。
%+
date(1) 形 式 で の 日 時 。 (TZ) (glibc2 で は サ ポ ー ト さ れ て い な い )
%%
'%' 文 字 。
い く つ か の 変 換 指 定 で は 、 変 換 指 定 文 字 の 前 に E や O 「 修 飾 子 」 を 置 く こ と に よ っ て 別 書 式 を 使 用 す る よ う に 指 定 す る こ と が で き る 。 現 在 の ロ ケ ー ル に お い て 別 書 式 が 存 在 し な い 場 合 に は 、 通 常 の 変 換 指 定 が 使 用 さ れ た か の よ う に 動 作 す る (SU)。 統 一 UNIX 規 格 (Single UNIX Specification) で は %Ec, %EC, %Ex, %EX, %Ey, %EY, %Od, %Oe, %OH, %OI, %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, に つ い て 記 述 が あ る 。 こ こ で O 修 飾 子 は 別 形 式 の 数 値 (ロ ー マ 数 字 と か ) を 指 定 す る た め に 使 用 す る 。 E 修 飾 子 は ロ ケ ー ル 依 存 の 別 表 現 を 指 定 す る の に 使 用 す る 。 (訳 注 : E 修 飾 子 は 日 本 で 使 用 さ れ て い る 「 昭 和 」 「 平 成 」 な ど の 元 号 に よ る 年 表 記 を 指 定 す る 。 glibc 2.2 以 降 で の み 有 効 ) 要 素 別 の 時 刻 構 造 体 tm の 詳 細 は <time.h> に 定 義 さ れ て い る 。 ctime(3) も 参 照 す る こ と 。
返 り 値
終 端 の ヌ ル バ イ ト を 含 め た 結 果 の 文 字 列 の 長 さ が max バ イ ト を 超 え な か っ た 場 合 、 strftime() 関 数 は 配 列 s に 格 納 さ れ た バ イ ト 数 を 返 す (こ の バ イ ト 数 に 終 端 の ヌ ル バ イ ト は 含 ま れ な い )。 終 端 の ヌ ル バ イ ト を 含 め た 結 果 の 文 字 列 の 長 さ が max バ イ ト を 超 え る 場 合 に は 、 strftime() は 0 を 返 し 、 配 列 の 内 容 は 不 定 と な る 。 返 り 値 0 は 必 ず し も エ ラ ー を 意 味 し て い る 訳 で は な い の で 注 意 す る こ と 。 例 え ば 、 多 く の ロ ケ ー ル で は %p は 空 文 字 列 を 返 す 。 同 様 に 、 空 の format 文 字 列 は 空 文 字 列 を 返 す 。
環 境 変 数
環 境 変 数 TZ と LC_TIME が 使 用 さ れ る 。 (訳 注 : LC_ALL が 設 定 さ れ て い る 場 合 に は LC_TIME よ り も そ ち ら が 優 先 さ れ る 。 LC_TIME も LC_ALL も 設 定 さ れ て い な い 場 合 に は LANG が 使 用 さ れ る 。 )
準 拠
SVr4, C89, C99. 個 々 の 変 換 が 厳 密 に ど の 規 格 に 含 ま れ る か は 、 ANSI C (印 な し )、 統 一 UNIX 規 格 (SU印 )、 Olson の timezone パ ッ ケ ー ジ (TZ印 )、 glibc 独 自 (GNU印 ) で 示 し て い る 。 glibc2 で は %+ は サ ポ ー ト さ れ て い な い が 、 い く つ か の 拡 張 が 行 わ れ て い る 。 POSIX.1 で は ANSI C の み を 参 照 し て い る 。 POSIX.2 の date(1) の と こ ろ に 記 述 さ れ て い る 幾 つ か の 拡 張 は strftime() に も 適 用 で き る だ ろ う 。 %F 変 換 は C99 と POSIX.1−2001 に あ る 。
SUSv2 で は 、 %S は 00 か ら 61 の 範 囲 を と る と 規 定 さ れ て い る 。 こ れ は 、 1分 間 の う ち 閏 秒 が 2つ 入 る 可 能 性 が 理 論 的 に は あ る こ と を 考 慮 し て の も の で あ る (実 際 に は 、 こ の よ う な 状 況 は こ れ ま で 一 度 も 起 こ っ て い な い )。
注 意
ISO 8601
の 週 ・ 曜 日 表
記 (Week Dates)
%G, %g, %V は 、 ISO 8601
標 準 に よ り 定
義 さ れ た 週 単
位 表 記 の 年 に
よ り 計 算 さ れ
る 値 を 出 力 す
る 。 ISO 8601 標 準 の
週 単 位 表 記 で
は 、 週 は 月 曜
日 か ら 開 始 さ
れ 、 週 番 号 は
、 年 の 最 初 の
週 が 01 と な り 、
最 後 の 週 は 52 か 53
と な る 。 週 01 は
、 新 し い 年 が 4
日 以 上 含 ま れ
る 最 初 の 週 で
あ る 。 言 い 換
え る と 、 週 01 は
、 そ の 年 の 木
曜 日 を 含 む 最
初 の 週 、 つ ま
り 1 月 4 日 を 含 む
週 と い う こ と
で あ る 。 新 し
い 年 の カ レ ン
ダ ー 上 の 最 初
の 週 に 新 し い
年 が 3 日 以 下 し
か 含 ま れ な い
場 合 、 ISO 8601 の 週
単 位 表 記 で は
、 こ れ ら の 日
を 前 の 年 の 週 53
の 一 部 と み な
す 。 例 え ば 、 2010
年 1 月 1 日 は 金 曜
日 で あ り 、 そ
の 週 に は 2010 年 の
日 が 3 日 し か 含
ま れ な い 。 し
た が っ て 、 ISO 8601
の 週 単 位 表 記
で は 、 こ れ ら
の 日 は 2009 年 (%G)
の 週 53 (%V) の 一 部
と な る 。 ISO 8601 の
2010 年 の 週 01 は 2010 年 1
月 4 日 の 月 曜 日
か ら 始 ま る 。
glibc
で の 注 意
glibc で は 変 換 指 定
に い く つ か 拡
張 を 行 っ て い
る (こ れ ら の 拡
張 は POSIX.1−2001 に は
規 定 さ れ て い
な い が 、 他 の
い く つ か の シ
ス テ ム で 同 様
の 機 能 が 提 供
さ れ て い る )。 '%'
文 字 と 変 換 指
定 文 字 の 間 に
、 オ プ シ ョ ン
と し て flag と フ
ィ ー ル ド の 幅
を 指 定 で き る
(こ れ ら を 指 定
す る 場 合 に は
E や O 修 飾 子
の 前 に 置 く )。
以 下 の フ ラ グ
文 字 が 使 用 で
き る :
_
(下 線 ) 数 値 の 結 果 文 字 列 の パ デ ィ ン グ (穴 埋 め ) を ス ペ ー ス (空 白 文 字 ) で 行 う 。
−
(ダ ッ シ ュ ) 数 値 の 結 果 文 字 列 に 対 す る パ デ ィ ン グ を 行 わ な い 。
0
変 換 指
定 文 字 が デ フ
ォ ル ト で は ス
ペ ー ス で パ デ
ィ ン グ を 行 う
場 合 で も 、 数
値 の 結 果 文 字
列 へ の パ デ ィ
ン グ を 0 で 行 う
。
^ 結 果 文 字 列 中
の ア ル フ ァ ベ
ッ ト 文 字 を
大 文 字 に 変 換 す る 。
# 結 果 文 字 列 の 大 文 字 ・ 小 文 字 を 入 れ 替 え る
(こ の フ ラ グ は 特 定 の 変 換 指
定 文 字 で し か 機 能 し な い 。 そ の 中 で も 本 当 に 有 用 な の は %Z の 場 合 だ け で あ る )。 オ プ シ ョ ン の 10進 数 の 幅 指 定 子 は フ ラ グ の 後 ろ に 置 く こ と が で き る (フ ラ グ は な く て も よ い )。 フ ィ ー ル ド の 本 来 の 大 き さ が 指 定 さ れ た 幅 よ り も 小 さ い 場 合 、 結 果 文 字 列 の 左 側 は 指 定 さ れ た 幅 ま で パ デ ィ ン グ さ れ る 。
バ グ
出 力 文 字 列 が max バ イ ト を 超 え て し ま う 場 合 、 errno は 設 定 「 さ れ な い 」 。 こ の た め 、 こ の エ ラ ー を 、 format 文 字 列 が き ち ん と 処 理 さ れ て 長 さ 0 の 出 力 文 字 列 が 生 成 さ れ る 場 合 を 区 別 す る こ と が で き な い 。 POSIX.1−2001 で は strftime() で errno に 設 定 す る 値 に つ い て 一 切 規 定 し て 「 い な い 」 。
gcc(1) の い く つ か の バ ー ジ ョ ン に は お か し な と こ ろ が あ り 、 %c の 使 用 法 に つ い て 以 下 の よ う な 警 告 を 出 す : warning: ’%c’ yields only last 2 digits of year in some locales (警 告 :い く つ か の ロ ケ ー ル で は ’%c’は 年 の 下 2桁 し か 出 力 し な い )。 も ち ろ ん プ ロ グ ラ マ が %c を 使 う の は お 薦 め で き る こ と で あ る 。 %c を 使 う と 適 切 な 日 付 と 時 刻 の 表 記 を 得 る こ と が で き る か ら で あ る 。 gcc(1) の こ の 問 題 を 回 避 し よ う と す る と 、 何 か す っ き り し な い 気 分 に な る だ ろ う 。 比 較 的 き れ い な 解 決 方 法 は 以 下 の よ う な 中 間 関 数 を 追 加 す る こ と で あ る 。
size_t
my_strftime(char *s, size_t max, const char *fmt,
const struct tm *tm)
{
return strftime(s, max, fmt, tm); } 現 在
で は 、 gcc(1) は こ
の 警 告 を 抑 え
る た め の
−Wno−format−y2k オ プ
シ ョ ン を 提 供
し て お り 、 上
記 の 回 避 策 は
も は や 必 要 な
い 。
例
RFC 2822 準 拠 の 日 付 形 式 (%a と %b は 英 語 ロ ケ ー ル )
"%a, %d %b %Y %T %z"
RFC 822 準 拠 の 日 付 形 式 (%a と %b は 英 語 ロ ケ ー ル )
"%a, %d %b %y %T %z" サ ン プ ル プ ロ グ ラ ム 以 下 の プ ロ グ ラ ム を 使 う と strftime() の 実 験 が で き る 。 以 下 に 、 strftime() の glibc 実 装 が 生 成 す る 結 果 の 例 を い く つ か 示 す :
$ ./a.out
'%m'
Result string is "11"
$ ./a.out '%5m'
Result string is "00011"
$ ./a.out '%_5m'
Result string is " 11" プ ロ
グ ラ ム の ソ ー
ス
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
char outstr[200];
time_t t;
struct tm *tmp;
t = time(NULL);
tmp = localtime(&t);
if (tmp == NULL) {
perror("localtime");
exit(EXIT_FAILURE); }
if
(strftime(outstr, sizeof(outstr), argv[1], tmp) == 0) {
fprintf(stderr, "strftime returned 0");
exit(EXIT_FAILURE); }
printf("Result
string is \"%s\"\n", outstr);
exit(EXIT_SUCCESS); }
関 連 項 目
date(1), time(2), ctime(3), setlocale(3), sprintf(3), strptime(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。