10157

51 分钟

#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)均会原封不动地复制到输出字符串中。

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

可用的格式说明符如下:

占位符(年)标准说明
%%C89表示 % 本身
%nC99表示换行符
%tC99表示水平制表符
占位符(年)标准说明示例输出(2011 年)
%YC99十进制年份"2011"
%CC99十进制年份的前两位数字(世纪)"20"
%yC99十进制年份的后两位数字"11"
%OyC99十进制年份的后两位替代数字"十一"
%EYC99替代格式的年份"平成 23 年"
%ECC99替代格式的基准年份"平成"
%EyC99替代格式的年份偏移量"23"
%GC99ISO 8601 标准下的年份-
%gC99ISO 8601 标准下的年份后两位数字-
占位符(月)标准说明示例输出(十月)
%mC89十进制数字表示的月份"10"
%BC89月份的完整名称"October" / "10 月"
%bC89月份缩写"Oct" / "10 月"
%hC99%b"Oct" / "10 月"
%OmC99替代数字系统的月份"10"
%OBC23替代格式的月份的完整名称"神無月"
%ObC23替代格式的月份缩写"神無"
占位符(日)标准说明示例输出
%jC89一年中的第几天(范围[01,366])"233"
%dC89月份中的日期(范围[01,31])"5"
%eC99月份中的日期(范围[01,31]),单个数字前补空格" 5"
%OdC99替代数字系统的 %d"五"
%0e C99替代数字系统的 %e" 五"-
占位符(周)标准说明示例输出
%UC89以星期日为周的第一天,一年中的第几周(范围[00,53])"32"
%WC89以星期一为周的第一天,一年中的第几周(范围[00,53])"32"
%OUC99替代数字系统的 %U"三十二"
%OWC99替代数字系统的 %W"三十二"
%VC99ISO 8601标准下,一年中的第几周(范围[01,53])"32"
%OVC99替代数字系统的 %V"三十二"
占位符(星期几)标准说明示例输出(星期五)
%aC89星期几的缩写"Fri" / "周五"
%AC89星期几的完整名称"Friday" / "星期五"
%wC89星期几的十进制数形式,其中星期日为 0(范围[0-6])"4"
%OwC99替代数字系统的 %w"四"
%uC99星期几的十进制数形式,其中星期一为 1(范围[1-7])"5"
%OuC99替代数字系统的 %u"五"
占位符(时分秒)标准说明示例输出(13:06:42)
%HC89时,24 小时制(范围[00-23])"13"
%IC89时,12 小时制(范围[01-12])"01"
%MC89分(范围[00-59])"06"
%SC89秒,含闰秒(范围[00-60])"42"
%OHC99替代数字系统的 %H"13"
%OIC99替代数字系统的 %I"01"
%OMC99替代数字系统的 %M"06"
%OSC99替代数字系统的 %S"42"
占位符标准说明示例输出
%cC89标准日期和时间"2011年10月09日 星期日 13时06分42秒"
%xC89本地化日期"2011年10月09日"
%XC89本地化时间"13时06分42秒"
%rC99本地化时间,12 小时制"下午 01时06分42秒"
%pC99AM(上午)或 PM(下午)"下午"
%EcC99替代日期和时间"平成23年10月09日 13時06分42秒"
%ExC99替代日期"平成23年10月09日"
%EXC99替代时间"13時06分42秒"
%DC99相当于 %m/%d/%y"10/09/11"
%FC99相当于 %Y-%m-%d"2011-10-09"
%RC99相当于 %H:%M"13:06"
%TC99相当于 %H:%M:S"13:06:42"
%zC89时区名称或缩写"+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/10/13

更新于 2025/10/13