Namespaces
Variants

strftime

来自 zh.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 年份 将 年份 tm_year
EY
写为十进制数,例如 2017
(C99)以替代表示写入 年份 tm_year
y ,例如在 ja_JP 本地化中写入 平成23年 而非 2011年 写入 年份[00,99] 的最后两位十进制数(范围 tm_year
Oy
)
(C99)使用替代数字系统写入 年份 tm_year
Ey
的最后两位,例如在 ja_JP 本地化中写入 十一 而非 11
(C99)将 年份%EC 写为相对于本地化替代日历周期 tm_year
C
的偏移量(本地化相关)
(C99)将 年份[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 基于周的年份 的最后两位,即包含指定周的年份(范围 [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]) tm_mon
Om
(C99)
使用替代数字系统写入 月份,例如在 ja_JP 本地化中写入 十二 而非 12 tm_mon
周
U 将 一年中的周 写为十进制数(星期日是一周的第一天)(范围 [00,53]) tm_year, tm_wday, tm_yday
OU
(C99)
使用替代数字系统写入 一年中的周,同 %U,例如在 ja_JP 本地化中写入 五十二 而非 52 tm_year, tm_wday, tm_yday
W 将 一年中的周 写为十进制数(星期一是每周的第一天)(范围 [00,53]) tm_year, tm_wday, tm_yday
OW
(C99)
使用替代数字系统写入 一年中的周,同 %W,例如在 ja_JP 本地化中写入 五十二 而非 52 tm_year, tm_wday, tm_yday
V
(C99)
写入 ISO 8601 一年中的周(范围 [01,53])。

在 ISO 8601 中,周从星期一开始,一年的第一周必须满足以下要求:

  • 包含 1 月 4 日
  • 包含一年的第一个星期四
tm_year, tm_wday, tm_yday
OV
(C99)
使用替代数字系统写入 一年中的周,同 %V,例如在 ja_JP 本地化中写入 五十二 而非 52 tm_year, tm_wday, tm_yday
一年中的第几天/月份中的第几天
j 将 一年中的第几天 写为十进制数(范围 [001,366]) tm_yday
d 将 月份中的第几天 写为十进制数(范围 [01,31]) tm_mday
Od
(C99)
使用替代数字系统写入从零开始的 月份中的第几天,例如在 ja_JP 本地化中写入 二十七 而非 27

个位数字前加空格。

tm_mday
e
(C99)
将 月份中的第几天 写为十进制数(范围 [1,31])。

个位数字前加空格。

tm_mday
Oe
(C99)
使用替代数字系统写入从 1 开始的 月份中的第几天,例如在 ja_JP 本地化中写入 二十七 而非 27

个位数字前加空格。

tm_mday
星期中的第几天
a 写入 缩写的星期几 名称,例如 Fri(本地化相关) tm_wday
A 写入 完整的星期几 名称,例如 Friday(本地化相关) tm_wday
w 将 星期几 写为十进制数,星期日为 0(范围 [0-6]) tm_wday
Ow
(C99)
使用替代数字系统写入 星期几,星期日为 0,例如在 ja_JP 本地化中写入 二 而非 2 tm_wday
u
(C99)
将 星期几 写为十进制数,星期一为 1(ISO 8601 格式)(范围 [1-7]) tm_wday
Ou
(C99)
使用替代数字系统写入 星期几,星期一为 1,例如在 ja_JP 本地化中写入 二 而非 2 tm_wday
小时、分钟、秒
H 将 小时 写为十进制数,24 小时制(范围 [00-23]) tm_hour
OH
(C99)
使用替代数字系统写入 24 小时制中的 小时,例如在 ja_JP 本地化中写入 十八 而非 18 tm_hour
I 将 小时 写为十进制数,12 小时制(范围 [01,12]) tm_hour
OI
(C99)
使用替代数字系统写入 12 小时制中的 小时,例如在 ja_JP 本地化中写入 六 而非 06 tm_hour
M 将 分钟 写为十进制数(范围 [00,59]) tm_min
OM
(C99)
使用替代数字系统写入 分钟,例如在 ja_JP 本地化中写入 二十五 而非 25 tm_min
S 将 秒 写为十进制数(范围 [00,60]) tm_sec
OS
(C99)
使用替代数字系统写入 秒,例如在 ja_JP 本地化中写入 二十四 而非 24 tm_sec
其他
c 写入 标准日期和时间字符串,例如 Sun Oct 17 04:41:13 2010(本地化相关) 全部
Ec
(C99)
写入 替代日期和时间字符串,例如在 ja_JP 本地化中使用 平成23年 而非 2011年 全部
x 写入本地化的 日期表示(本地化相关) 全部
Ex
(C99)
写入 替代日期表示,例如在 ja_JP 本地化中使用 平成23年 而非 2011年 全部
X 写入本地化的 时间表示,例如 18:40:20 或下午 6:40:20(本地化相关) 全部
EX
(C99)
写入 替代时间表示(本地化相关) 全部
D
(C99)
等同于 "%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 strftime 函数 (p: TBD)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.27.3.5 strftime 函数 (p: 288-291)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.27.3.5 strftime 函数 (p: 394-397)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.23.3.5 strftime 函数 (p: 343-347)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.12.3.5 strftime 函数

参阅

(C23 中弃用)(C11)
将 tm 对象转换为文本表示
(函数)
(C23 中弃用)(C11)
将 time_t 对象转换为文本表示
(函数)
将 tm 对象转换为自定义宽字符串文本表示
(函数)
C++ 文档 关于 strftime