国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > strftime 以获得更好的体验。

# C 语言标准库函数 strftime

在头文件 time.h 中定义。
/*********************************************
 * @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)均会原封不动地复制到输出字符串中。

每个转换说明符均以 % 字符开头,后跟可选的 EO(大写字母)修饰符(如果语言环境不支持,则忽略),后跟决定说明符行为的字符。

可用的格式说明符如下:

占位符(年) 标准 说明
%% 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

本文 更新于: 2025-11-27 09:38:10 创建于: 2025-11-27 09:38:10