Namespaces
Variants

strftime

ja.cppreference.net より
< c | chrono
ヘッダ <time.h>
size_t strftime( char* str, size_t count,
                 const char* format, const struct tm* tp );
(C99 まで)
size_t strftime( char* restrict str, size_t count,
                 const char* restrict format, const struct tm* restrict tp );
(C99 から)

指定されたカレンダー時刻 tp から、ヌル終端マルチバイト文字列 str へ、書式文字列 format に従って変換します。最大 count バイトが書き込まれます。

引数

str - 出力先のchar配列の先頭要素へのポインタ
count - 書き込む最大バイト数
format - 変換の書式を指定するヌル終端マルチバイト文字列へのポインタ変換の書式
tp - 書式化する時刻を指定するstruct tmオブジェクトへのポインタ

書式文字列

書式文字列は、ゼロ個以上の変換指定子と通常の文字(% を除く)から構成されます。終端ヌル文字を含むすべての通常の文字は、変更されずに出力文字列にコピーされます。各変換指定は % 文字で始まり、オプションで E または O 修飾子(ロケールでサポートされていない場合は無視されます)が続き、その後ろに指定子の動作を決定する文字が続きます。以下の変換指定子が利用可能です:

変換指定子
説明 使用されるフィールド
% リテラル % を書き込みます。完全な変換指定は %% でなければなりません。
n
(C99)
改行文字を書き込みます
t
(C99)
水平タブ文字を書き込みます
年
Y 年 を10進数で書き込みます (例: 2017) tm_year
EY
(C99)
年 を代替表現で書き込みます (例: ja_JPロケールでは 2011年 の代わりに 平成23年) tm_year
y 年 の下2桁を10進数で書き込みます (範囲 [00,99]) tm_year
Oy
(C99)
年 の下2桁を代替数字システムで書き込みます (例: ja_JPロケールでは 11 の代わりに 十一) tm_year
Ey
(C99)
年 をロケールの代替暦期間 %EC からのオフセットとして書き込みます (ロケール依存) tm_year
C
(C99)
年 の最初の2桁を10進数で書き込みます (範囲 [00,99]) tm_year
EC
(C99)
基準年 (期間) の名前をロケールの代替表現で書き込みます (例: ja_JP では 平成) tm_year
G
(C99)
ISO 8601 週ベースの年 を書き込みます。すなわち、指定された週を含む年です。ISO 8601 では週は月曜始まりで、年の最初の週は次の要件を満たす必要があります:

1月4日を含む

  • 年の最初の木曜日を含む
  • ,
tm_year, tm_wday tm_yday
g
(C99)
ISO 8601 週ベースの年 の下2桁を10進数で書き込みます (範囲 [00,99])。ISO 8601 では週は月曜始まりで、年の最初の週は次の要件を満たす必要があります:

1月4日を含む

  • 年の最初の木曜日を含む
  • ,
tm_year, tm_wday tm_yday
月
b 月の短縮名 を書き込みます (例: Oct) (ロケール依存) tm_mon
Ob
(C23)
月の短縮名 をロケールの代替表現で書き込みます tm_mon
h
(C99)
b tm_mon
B の同義語 月の完全名October を書き込みます (例: tm_mon
OB
) (ロケール依存)
(C23)月の完全名 tm_mon
m をロケールの代替表現で書き込みます 月[01,12] を10進数で書き込みます (範囲 tm_mon
Om
)
(C99)月 tm_mon
を代替数字システムで書き込みます (例: ja_JPロケールでは 12 の代わりに 十二)
U 週 年の週番号[00,53] を10進数で書き込みます (週の初日は日曜日) (範囲 tm_year) tm_wday, tm_yday
OU
,
(C99)年の週番号%U を、 tm_year と同様に、代替数字システムで書き込みます (例: ja_JPロケールでは 52 の代わりに 五十二) tm_wday, tm_yday
W , 年の週番号[00,53] を10進数で書き込みます (週の初日は月曜日) (範囲 tm_year) tm_wday, tm_yday
OW
,
(C99)年の週番号%W を、 tm_year と同様に、代替数字システムで書き込みます (例: ja_JPロケールでは 52 の代わりに 五十二) tm_wday, tm_yday
V
,
(C99)ISO 8601 週番号[01,53] を書き込みます (範囲

)。ISO 8601 では週は月曜始まりで、年の最初の週は次の要件を満たす必要があります:

  • 1月4日を含む
  • 年の最初の木曜日を含む
tm_year, tm_wday, tm_yday
OV
(C99)週番号%V を、 tm_year と同様に、代替数字システムで書き込みます (例: ja_JPロケールでは 52 の代わりに 五十二) tm_wday, tm_yday
,
j 年の日/月の日 年の通算日[001,366] を10進数で書き込みます (範囲 tm_yday
d ) 月の日[01,31] を10進数で書き込みます (範囲 tm_mday
Od
)
(C99)ゼロ基点の 月の日

を代替数字システムで書き込みます (例: ja_JPロケールでは 27 の代わりに 二十七)。1文字の場合は前にスペースが付きます。

tm_mday
e
(C99)
月の日 を10進数で書き込みます (範囲 [1,31])。1桁の場合は前にスペースが付きます。

(C99)

tm_mday
Oe
1基点の
月の日 を代替数字システムで書き込みます (例: ja_JPロケールでは 27 の代わりに 二十七)。1文字の場合は前にスペースが付きます。 曜日

tm_mday
曜日の短縮名
a を書き込みます (例: ) (ロケール依存) Fri曜日の完全名 tm_wday
A を書き込みます (例: ) (ロケール依存) Friday曜日 tm_wday
w を10進数で書き込みます (日曜日は ) (範囲 ) 0(C99)[0-6] tm_wday
Ow
曜日
を、日曜日は 、代替数字システムで書き込みます (例: ja_JPロケールでは 2 の代わりに 二) (C99)0 tm_wday
u
曜日
を10進数で書き込みます (月曜日は ) (ISO 8601 形式) (範囲 ) 1(C99)[1-7] tm_wday
Ou
曜日
を、月曜日は 、代替数字システムで書き込みます (例: ja_JPロケールでは 2 の代わりに 二) 時, 分, 秒 1 tm_wday
時
H を10進数で書き込みます (24時間制) (範囲 ) (C99)[00-23]24時間制の tm_hour
OH
時
を代替数字システムで書き込みます (例: ja_JPロケールでは 18 の代わりに 十八) 時 tm_hour
I を10進数で書き込みます (12時間制) (範囲 ) (C99)[01,12]12時間制の tm_hour
OI
時
を代替数字システムで書き込みます (例: ja_JPロケールでは 06 の代わりに 六) 分 tm_hour
M を10進数で書き込みます (範囲 ) (C99)[00,59] tm_min
OM
分
を代替数字システムで書き込みます (例: ja_JPロケールでは 25 の代わりに 二十五) 秒 tm_min
S を10進数で書き込みます (範囲 ) (C99)[00,60] tm_sec
OS
秒
を代替数字システムで書き込みます (例: ja_JPロケールでは 24 の代わりに 二十四) その他 tm_sec
標準の日時文字列
c を書き込みます (例: ) (ロケール依存) all Sun Oct 17 04:41:13 2010(C99)
Ec
代替の日時文字列
を書き込みます (例: ja_JPロケールでは 2011年 の代わりに 平成23年) all ロケールに応じた 日付表現
x を書き込みます (ロケール依存) all (C99)
Ex
代替の日付表現
を書き込みます (例: ja_JPロケールでは 2011年 の代わりに 平成23年) all ロケールに応じた 時刻表現
X を書き込みます (例: 18:40:20 または 6:40:20 PM) (ロケール依存) all (C99)
EX
代替の時刻表現
を書き込みます (ロケール依存) all (C99)
D
"%m/%d/%y" と同等です ( tm_mon, tm_mday) tm_year
F
(C99)
"%Y-%m-%d" (ISO 8601 日付形式) と同等です tm_mon, tm_mday, tm_year
r
(C99)
ロケールに応じた 12時間制 の時刻を書き込みます (ロケール依存) tm_hour, tm_min, tm_sec
R
(C99)
"%H:%M" tm_hour と同等です tm_min
T
(C99)
"%H:%M:%S" (ISO 8601 時刻形式) と同等です tm_hour, tm_min, tm_sec
p ロケールに応じた 午前または午後 を書き込みます (ロケール依存) tm_hour
z
(C99)
ISO 8601 形式で UTC からのオフセット を書き込みます (例: -0430)。タイムゾーン情報が利用できない場合は何も書き込みません。 tm_isdst
Z ロケールに応じた タイムゾーン名または略称 を書き込みます。タイムゾーン情報が利用できない場合は何も書き込みません。 tm_isdst

戻り値

成功した場合、str が指す文字配列に書き込まれたバイト数 (終端の '\0' は含みません)。文字列全体を格納する前に count に達した場合は、0 が返され、内容は不定です。

例

#include <locale.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
    char buff[70];
    struct tm my_time =
    {
        .tm_year = 112, // = year 2012
        .tm_mon = 9,    // = 10th month
        .tm_mday = 9,   // = 9th day
        .tm_hour = 8,   // = 8 hours
        .tm_min = 10,   // = 10 minutes
        .tm_sec = 20    // = 20 secs
    };

    if (strftime(buff, sizeof buff, "%A %c", &my_time))
        puts(buff);
    else
        puts("strftime failed");

    setlocale(LC_TIME, "el_GR.utf8");

    if (strftime(buff, sizeof buff, "%A %c", &my_time))
        puts(buff);
    else
        puts("strftime failed");
}

出力例:

Sunday Sun Oct  9 08:10:20 2012
Κυριακή Κυρ 09 Οκτ 2012 08:10:20 πμ EST

参考文献

  • C23 標準 (ISO/IEC 9899:2024):
  • 7.27.3.5 The strftime 関数 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018):
  • 7.27.3.5 The strftime 関数 (p: 288-291)
  • C11 標準 (ISO/IEC 9899:2011):
  • 7.27.3.5 The strftime 関数 (p: 394-397)
  • C99 標準 (ISO/IEC 9899:1999):
  • 7.23.3.5 The strftime 関数 (p: 343-347)
  • C89/C90 標準 (ISO/IEC 9899:1990):
  • 4.12.3.5 The strftime 関数

関連項目

(C23 で非推奨)(C11)
tm オブジェクトをテキスト表現に変換します
(関数)
(C23 で非推奨)(C11)
time_t オブジェクトをテキスト表現に変換します
(関数)
tm オブジェクトをカスタムのワイド文字列テキスト表現に変換します
(関数)
の)