strftime
来自 zh.cppreference.net
| 定义于头文件 <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 中,周从星期一开始,一年的第一周必须满足以下要求:
|
tm_year, tm_wday, tm_yday
|
g(C99) |
写入 ISO 8601 基于周的年份 的最后两位,即包含指定周的年份(范围 [00,99])。
在 ISO 8601 中,周从星期一开始,一年的第一周必须满足以下要求:
|
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 中,周从星期一开始,一年的第一周必须满足以下要求:
|
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 对象转换为文本表示 (函数) |
(C95) |
将 tm 对象转换为自定义宽字符串文本表示 (函数) |
C++ 文档 关于 strftime
| |