#C 语言标准库函数 strftime
/*********************************************
* @brief 将日历时间 struct tm 转换为自定义的文本形式
* @param[out] str 返回转换后的文本
* @param count 最多可写入 str 的字节数(含结尾的 '\0')
* @param fmt 格式字符串
* @param t 要被转换的时间
* @return
********************************************/
size_t strftime(char* str, size_t count, const char* fmt, const struct tm* t);
说明
将日历时间 tm 转换为自定义的文本形式。
参数
str
- 回转换后的文本(含结尾的'\0'
)count
- 最多可写入str
的字节数(含结尾的'\0'
)fmt
- 格式字符串t
- 要被转换的日历时间
返回值
- 成功时返回写入
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