/*********************************************
* @brief 将日历时间 struct tm 转换为自定义的文本形式
* @param[out] str 返回转换后的文本
* @param count 最多可写入 str 的字节数(含结尾的 '\0')
* @param fmt 格式字符串
* @param t 要被转换的时间
* @return 返回写入 str 的字节数
********************************************/
size_t strftime(char* str, size_t count, const char* fmt, const struct tm* t);
!subtitle:说明
将日历时间 tm 转换为自定义的文本形式。
!subtitle:参数
str - 回转换后的文本(含结尾的 '\0')
count - 最多可写入 str 的字节数(含结尾的 '\0')
fmt - 格式字符串
t - 要被转换的日历时间
!subtitle:返回值
成功时返回写入 str 的字节数(不含结尾的 \0)
失败时返回 0(例如需要写入的字节数大于 count)
格式字符串由零个或多个转换说明符和普通字符(% 除外)组成。所有普通字符(包括终止字符 \0)均会原封不动地复制到输出字符串中。
每个转换说明符均以 % 字符开头,后跟可选的 E 或 O(大写字母)修饰符(如果语言环境不支持,则忽略),后跟决定说明符行为的字符。
可用的格式说明符如下:
| 占位符(年) | 标准 | 说明 |
|---|---|---|
%% |
C89 | 表示 % 本身 |
%n |
C99 | 表示换行符 |
%t |
C99 | 表示水平制表符 |
| 占位符(年) | 标准 | 说明 | 示例输出(2011 年) |
|---|---|---|---|
%Y |
C99 | 十进制年份 | "2011" |
%C |
C99 | 十进制年份的前两位数字(世纪) | "20" |
%y |
C99 | 十进制年份的后两位数字 | "11" |
%Oy |
C99 | 十进制年份的后两位替代数字 | "十一" |
%EY |
C99 | 替代格式的年份 | "平成 23 年" |
%EC |
C99 | 替代格式的基准年份 | "平成" |
%Ey |
C99 | 替代格式的年份偏移量 | "23" |
%G |
C99 | ISO 8601 标准下的年份 | |
%g |
C99 | ISO 8601 标准下的年份后两位数字 |
| 占位符(月) | 标准 | 说明 | 示例输出(十月) |
|---|---|---|---|
%m |
C89 | 十进制数字表示的月份 | "10" |
%B |
C89 | 月份的完整名称 | "October" / "10 月" |
%b |
C89 | 月份缩写 | "Oct" / "10 月" |
%h |
C99 | 同 %b |
"Oct" / "10 月" |
%Om |
C99 | 替代数字系统的月份 | "10" |
%OB |
C23 | 替代格式的月份的完整名称 | "神無月" |
%Ob |
C23 | 替代格式的月份缩写 | "神無" |
| 占位符(日) | 标准 | 说明 | 示例输出 |
| :- | :- | :- | :- |
| %j | C89 | 一年中的第几天(范围[01,366]) | "233" |
| %d | C89 | 月份中的日期(范围[01,31]) | "5" |
| %e | C99 | 月份中的日期(范围[01,31]),单个数字前补空格 | " 5" |
| %Od | C99 | 替代数字系统的 %d | "五" |
| %0e C99 | 替代数字系统的 %e | " 五" |
| 占位符(周) | 标准 | 说明 | 示例输出 |
|---|---|---|---|
%U |
C89 | 以星期日为周的第一天,一年中的第几周(范围[00,53]) | "32" |
%W |
C89 | 以星期一为周的第一天,一年中的第几周(范围[00,53]) | "32" |
%OU |
C99 | 替代数字系统的 %U |
"三十二" |
%OW |
C99 | 替代数字系统的 %W |
"三十二" |
%V |
C99 | ISO 8601标准下,一年中的第几周(范围[01,53]) | "32" |
%OV |
C99 | 替代数字系统的 %V |
"三十二" |
| 占位符(星期几) | 标准 | 说明 | 示例输出(星期五) |
|---|---|---|---|
%a |
C89 | 星期几的缩写 | "Fri" / "周五" |
%A |
C89 | 星期几的完整名称 | "Friday" / "星期五" |
%w |
C89 | 星期几的十进制数形式,其中星期日为 0(范围[0-6]) | "4" |
%Ow |
C99 | 替代数字系统的 %w |
"四" |
%u |
C99 | 星期几的十进制数形式,其中星期一为 1(范围[1-7]) | "5" |
%Ou |
C99 | 替代数字系统的 %u |
"五" |
| 占位符(时分秒) | 标准 | 说明 | 示例输出(13:06:42) |
|---|---|---|---|
%H |
C89 | 时,24 小时制(范围[00-23]) | "13" |
%I |
C89 | 时,12 小时制(范围[01-12]) | "01" |
%M |
C89 | 分(范围[00-59]) | "06" |
%S |
C89 | 秒,含闰秒(范围[00-60]) | "42" |
%OH |
C99 | 替代数字系统的 %H |
"13" |
%OI |
C99 | 替代数字系统的 %I |
"01" |
%OM |
C99 | 替代数字系统的 %M |
"06" |
%OS |
C99 | 替代数字系统的 %S |
"42" |
| 占位符 | 标准 | 说明 | 示例输出 |
|---|---|---|---|
%c |
C89 | 标准日期和时间 | "2011年10月09日 星期日 13时06分42秒" |
%x |
C89 | 本地化日期 | "2011年10月09日" |
%X |
C89 | 本地化时间 | "13时06分42秒" |
%r |
C99 | 本地化时间,12 小时制 | "下午 01时06分42秒" |
%p |
C99 | AM(上午)或 PM(下午) | "下午" |
%Ec |
C99 | 替代日期和时间 | "平成23年10月09日 13時06分42秒" |
%Ex |
C99 | 替代日期 | "平成23年10月09日" |
%EX |
C99 | 替代时间 | "13時06分42秒" |
%D |
C99 | 相当于 %m/%d/%y |
"10/09/11" |
%F |
C99 | 相当于 %Y-%m-%d |
"2011-10-09" |
%R |
C99 | 相当于 %H:%M |
"13:06" |
%T |
C99 | 相当于 %H:%M:S |
"13:06:42" |
%z |
C89 | 时区名称或缩写 | "+0000" |
#include <locale.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
char buff[256];
struct tm my_time = { .tm_year = 111, // = 2012 年
.tm_mon = 9, // = 10 月
.tm_mday = 9, // = 5 日
.tm_hour = 13, // = 13 时
.tm_min = 6, // = 6 分
.tm_sec = 42 // = 43 秒
};
if (strftime(buff, sizeof buff, "%Y %m %d %A", &my_time))
puts(buff);
else
puts("失败");
// 日期格式设为中文
setlocale(LC_TIME, "zh_CN.UTF-8");
if (strftime(buff, sizeof buff, "%EY %Om %Od %A", &my_time))
puts(buff);
else
puts("失败");
// 日期格式设为日文
setlocale(LC_TIME, "ja_JP.UTF-8");
if (strftime(buff, sizeof buff, "%EY %Om %Od %A", &my_time))
puts(buff);
else
puts("失败");
return 0;
}
运行结果:
2011 10 09 Sunday
2011 10 09 星期日
平成23年 十 九 日曜日
C23 standard (ISO/IEC 9899:2024):
7.29.3.5 The strftime function (p: TBD)
C17 standard (ISO/IEC 9899:2018):
7.27.3.5 The strftime function (p: 288-291)
C11 standard (ISO/IEC 9899:2011):
7.27.3.5 The strftime function (p: 394-397)
C99 standard (ISO/IEC 9899:1999):
7.23.3.5 The strftime function (p: 343-347)
C89/C90 standard (ISO/IEC 9899:1990):
4.12.3.5 The strftime function