Available in

(3) (3)/de (3)/es (3)/fr (3)/ja (3)/pt

Contents

名 前

strftime − 日 付 お よ び 時 刻 の 文 字 列 へ の 変 換

書 式

#include <time.h>

size_t strftime(char *s, size_t max, const char *format,
const struct tm *
tm);

説 明

strftime() 関 数 は 、 要 素 別 の 時 刻 tm の 内 容 を format で 指 定 さ れ た 書 式 指 定 に し た が っ て 変 換 し 、 長 さ max の 文 字 列 s に 書 き 込 む 。 書 式 文 字 列 に 含 ま れ る 通 常 の 文 字 は 変 換 さ れ ず そ の ま ま 文 字 列 s に コ ピ ー さ れ る 。 「 変 換 指 定 」 は '%' 文 字 で 始 ま り 、 「 変 換 指 定 文 字 」 で 終 端 さ れ る 。 以 下 の よ う に 変 換 さ れ て 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 形 式 の 年 (世 紀 も 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

紀 元 (1970年 1 月 1 日 00:00:00 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:1988 形 式 で の 年 の 始 め か ら の 週 数 (10 進 数 表 記 ) (00-53)。 そ の 年 に 少 な く と も 4 日 以 上 含 ま れ る 最 初 の 週 を 1 と し て 計 算 す る 。 週 の 始 ま り は 月 曜 日 と す る 。 %U%W も 参 照 す る こ と 。

%w

週 の 何 番 目 の 日 (10 進 数 表 記 ) か 。 日 曜 日 を 0 と す る 。 (0-6)。 %u も 参 照 。 (SU)

%W

年 の 初 め か ら の 通 算 の 週 数 (10 進 数 表 記 ) (00-53)。 そ の 年 の 最 初 の 月 曜 日 を 、 第 1 週 の 始 ま り と し て 計 算 す る 。
%x

現 在 の ロ ケ ー ル で 一 般 的 な 日 付 表 記 。 時 刻 は 含 ま な い 。

%X 現 在 の ロ ケ ー ル で 一 般 的 な 時 刻 表 記 。 日 付 は 含 ま な い 。

%y 西 暦 の 下

2桁 (世 紀 部 分 を 含 ま な い 年 ) (00-99)。

%Y 世 紀 部 分 を 含 め た

( 4 桁 の ) 西 暦 年 。

%z タ イ ム ゾ ー ン の

GMT へ の オ フ セ ッ ト 時 間 。 RFC 822 形 式 の 日 時 に 必 要

で あ る 。 ("%a, %d %b %Y %H:%M:%S %z" と し て 使 用 す る )。 (GNU)

%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) も 参 照 す る こ と 。

返 り 値

strftime() 関 数 は 文 字 列 s に 格 納 さ れ た 文 字 数 を 返 す 。 こ の 文 字 数 に 終 端 の NULL バ イ ト は 含 ま な い 。 終 端 の NULL バ イ ト を 格 納 で き る だ け の 大 き さ を 持 っ た 文 字 列 を 渡 す こ と 。 そ れ 以 外 の 場 合 は 0 を 返 し 、 文 字 列 の 内 容 は 修 正 さ れ な い 。 (libc 4.4.4 以 降 で こ の 挙 動 が 適 用 さ れ て い る 。 libc 4.4.1 な ど の 非 常 に 古 い バ ー ジ ョ ン の libc で は 文 字 列 が 短 か 過 ぎ た 場 合 に は max が 返 さ れ る 。 ) 返 り 値 0 は 必 ず し も エ ラ ー を 意 味 し て い る 訳 で は な い の で 注 意 す る こ と 。 例 え ば 、 多 く の ロ ケ ー ル で は %p は 空 文 字 列 を 返 す 。

環 境 変 数

環 境 変 数 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つ 入 る 可 能 性 が 理 論 的 に は あ る こ と を 考 慮 し て の も の で あ る (実 際 に は 、 こ の よ う な 状 況 は こ れ ま で 一 度 も 起 こ っ て い な い )。

注 意

glibc で の 注 意
glibc で は 変 換 指 定 に い く つ か 拡 張 を 行 っ て い る (こ れ ら の 拡 張 は POSIX.1-2001 に は 規 定 さ れ て い な い が 、 他 の い く つ か の シ ス テ ム で 同 様 の 機 能 が 提 供 さ れ て い る )。 '%' 文 字 と 変 換 指 定 文 字 の 間 に 、 オ プ シ ョ ン と し て flag と フ ィ ー ル ド の を 指 定 で き る (こ れ ら を 指 定 す る 場 合 に は EO 修 飾 子 の 前 に 置 く )。 以 下 の フ ラ グ 文 字 が 使 用 で き る :

_

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

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

0

変 換 指 定 文 字 が デ フ ォ ル ト で は ス ペ ー ス で パ デ ィ ン グ を 行 う 場 合 で も 、 数 値 の 結 果 文 字 列 へ の パ デ ィ ン グ を 0 で 行 う 。
^
結 果 文 字 列 中 の ア ル フ ァ ベ ッ ト 文 字 を

大 文 字 に 変 換 す る 。

# 結 果 文 字 列 の 大 文 字 ・ 小 文 字 を 入 れ 替 え る

(こ の フ ラ グ は 特 定 の 変 換 指

定 文 字 で し か 機 能 し な い 。 そ の 中 で も 本 当 に 有 用 な の は %Z の 場 合 だ け で あ る )。 オ プ シ ョ ン の 10進 数 の 幅 指 定 子 は フ ラ グ の 後 ろ に 置 く こ と が で き る (フ ラ グ は な く て も よ い )。 フ ィ ー ル ド の 本 来 の 大 き さ が 指 定 さ れ た 幅 よ り も 小 さ い 場 合 、 結 果 文 字 列 の 左 側 は 指 定 さ れ た 幅 ま で パ デ ィ ン グ さ れ る 。

バ グ

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 オ プ シ ョ ン を 提 供 し て お り 、 上 記 の 回 避 策 は も は や 必 要 な い 。

以 下 の プ ロ グ ラ ム を 使 う と 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]; 以 下 に 、
strftime
() の
glibc 実 装 が 生 成 す る 結 果 の 例 を い く つ か 示 す :

$ ./a.out "%m"
Result string is "11"
$ ./a.out "%5m"
Result string is "00011"
$ ./a.out "%_5m"
Result string is " 11"
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); } /* main */

関 連 項 目

date(1), time(2), ctime(3), setlocale(3), sprintf(3), strptime(3)

COMMENTS

blog comments powered by Disqus