Manpages

名 前

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 で は サ ポ ー ト さ れ て い な い )

%%

'%' 文 字 。

い く つ か の 変 換 指 定 で は 、 変 換 指 定 文 字 の 前 に EO 「 修 飾 子 」 を 置 く こ と に よ っ て 別 書 式 を 使 用 す る よ う に 指 定 す る こ と が で き る 。 現 在 の ロ ケ ー ル に お い て 別 書 式 が 存 在 し な い 場 合 に は 、 通 常 の 変 換 指 定 が 使 用 さ れ た か の よ う に 動 作 す る (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 文 字 列 は 空 文 字 列 を 返 す 。

環 境 変 数

環 境 変 数 TZLC_TIME が 使 用 さ れ る 。 (訳 注 : LC_ALL が 設 定 さ れ て い る 場 合 に は LC_TIME よ り も そ ち ら が 優 先 さ れ る 。 LC_TIMELC_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 と フ ィ ー ル ド の を 指 定 で き る (こ れ ら を 指 定 す る 場 合 に は EO 修 飾 子 の 前 に 置 く )。 以 下 の フ ラ グ 文 字 が 使 用 で き る :

_

(下 線 ) 数 値 の 結 果 文 字 列 の パ デ ィ ン グ (穴 埋 め ) を ス ペ ー ス (空 白 文 字 ) で 行 う 。

(ダ ッ シ ュ ) 数 値 の 結 果 文 字 列 に 対 す る パ デ ィ ン グ を 行 わ な い 。

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/ に 書 か れ て い る 。