跳到主要内容

C++ strftime() 函数

strftime() 函数定义在 <ctime> 头文件中。

strftime() 函数原型

size_t strftime( char* str, size_t count, const char* format, const tm* time );

strftime() 函数接受 4 个参数:strcountformattime

time 指向的日期和时间信息根据 format 的值转换为以空字符结尾的多字节字符,并存储在 str 指向的数组中。最多写入 count 个字节。

strftime() 参数

  • str:指向字符数组第一个元素的指针,用于存储结果。
  • count:要写入的最大字节数。
  • format:指向以空字符结尾的多字节字符字符串的指针,指定转换的格式。格式字符串由转换说明符(以 % 开头,可选地跟随 E 或 O)和其他普通字符组成。 普通字符包括终止空字符,按原样复制到输出字符串中。

strftime() 格式说明符

| 转换说明符 | 描述 | 使用的字段 | | ------------------ | --------------------------------------------------------------------------------- | ------------------------- | --- | --- | ---------------------------------------------------------------------------------------------- | -------- | | % | 写入字符 % | | | n | 写入换行符 | | | t | 写入水平制表符 | | | | | | | Y | 写入 4 位数字的年份,例如 2011 | tm_year | | EY | 以地区的替代表示法写入 4 位数字的年份 | tm_year | | y | 写入年份的最后 2 位数字,范围 [00, 99] | tm_year | | Oy | 以地区的替代表示法写入年份的最后 2 位数字 | tm_year | | Ey | 以地区替代日历周期 %EC 的偏移量写入年份 | tm_year | | C | 写入年份的前 2 位数字,范围 [00,99] | tm_year | | EC | 以地区替代表示法写入基年(周期)的名称 | tm_year | | G | 写入 ISO 8601 周为基础的年份,即包含指定周的年份。 | tm_year, tm_wday, tm_yday | | g | 写入 ISO 8601 周为基础的年份的最后 2 位数字,即包含指定周的年份(范围 [00,99])。 | tm_year, tm_wday, tm_yday | | | | | | b | 写入缩写的月份名称,例如 Jan | tm_mon | | h | 与 b 相同 | tm_mon | | B | 写入完整的月份名称,例如 January | tm_mon | | m | 以十进制数写入月份,范围 [01,12] | tm_mon | | Om | 使用本地化的替代数字系统写出月份 | tm_mon | | 星期 | | | | U | 以十进制数字写出一年中的周数,范围从 00 到 53(周日为一周的第一天) | tm_year, tm_wday, tm_yday | | OU | 使用替代数字系统按 %U 的格式写出一年中的周数 | tm_year, tm_wday, tm_yday | | W | 以十进制数字写出一年中的周数,范围从 00 到 53(周一为一周的第一天) | tm_year, tm_wday, tm_yday | | OW | 使用替代数字系统按 %W 的格式写出一年中的周数 | tm_year, tm_wday, tm_yday | | V | 按 ISO 8601 格式写出一年中的周数(范围 [01,53]) | tm_year, tm_wday, tm_yday | | OV | 使用替代数字系统按 %V 的格式写出一年中的周数 | tm_year, tm_wday, tm_yday | | 年内的日/月 | | | | j | 以十进制数字写出一年中的天数,范围 [001,366] | tm_yday | | d | 以十进制数字写出月份中的日子,范围 [01,31] | tm_mday | | Od | 使用替代数字系统按 %d 的格式写出月份中的日子 | tm_mday | | e | 以十进制数字写出月份中的日子,范围 [1,31] | tm_mday | | Oe | 使用替代数字系统按 %e 的格式写出月份中的日子 | tm_mday | | 星期中的日 | | | | a | 写出缩写的星期名,例如 Fri(依赖于地区) | tm_wday | | A | 写出完整的星期名,例如 Friday(依赖于地区) | tm_wday | | w | 以十进制数字写出星期中的日子,范围 [0-6](周日为 0) | tm_wday | | Ow | 使用替代数字系统按 %w 的格式写出星期中的日子 | tm_wday | | u | 以十进制数字写出星期中的日子,其中周一为 1(ISO 8601 格式),范围 [1-7] | tm_wday | | Ou | 使用替代数字系统按 %u 的格式写出星期中的日子 | tm_wday | | 小时、分钟、秒 | | | | H | 以十进制数字写出小时数,范围 [00,23] | tm_hour | | OH | 使用替代数字系统按 %H 的格式写出小时数 | tm_hour | | I | 以十进制数字写出小时数,范围 [01,12] | tm_hour | | OI | 使用替代数字系统按 %I 的格式写出小时数 | tm_hour | | M | 以十进制数字写出分钟数,范围 [00,59] | tm_min | | OM | 使用替代数字系统按 %M 的格式写出分钟数 | tm_min | | S | 以十进制数字写出秒数,范围 [00,60] | tm_sec | | OS | 使用替代数字系统按 %S 的格式写出秒数 | tm_sec | | 其他 | | | | c | 写出标准的日期和时间字符串,例如 Sun Oct 17 04:41:13 2010(依赖于地区) | all | | Ec | 写出本地化的替代日期和时间字符串 | all | | x | 写出本地化的日期表示(依赖于地区) | all | | Ex | 写出本地化的替代日期表示 | all | | X | 写出本地化的时间表示(依赖于地区) | all | | EX | 写出本地化的替代时间表示 | all | | D | 等同于 "%m/%d/%y" | tm_mon, tm_mday, tm_year | | F | 等同于 "%Y-%m-%d" | tm_mon, tm_mday, tm_year | | r | 写出本地化的 12 小时制时间 | tm_hour, tm_min, tm_sec | | R | 等同于 "%H:%M" | tm_hour, tm_min | | T | 等同于 "%H:%M:%S" | tm_hour, tm_min, tm_sec | | P | 写出本地化的上午或下午(依赖于地区) | tm_hour | | z | 以 ISO 8601 格式写出 UTC 偏移量(例如 -0545),如果没有时区信息则不写任何字符 | tm_isdst | | Z | 如果时区信息可用,则写入时区名称或缩写,如果时区信息不可用,则不写入任何内容(依赖于地区设置) | tm_isdst |

  • time:要转换的日期和时间信息。

strftime() 返回值

  • 成功时,strftime() 函数返回写入指向 str 的字符数组中的字节数,不包括终止符 '\0'。
  • 如果在整个字符串存储完之前就达到了 count,则返回 0,内容是未定义的。

示例:strftime() 函数如何工作?

#include <ctime>
#include <iostream>
using namespace std;

int main()
{
time_t curr_time;
tm * curr_tm;
char date_string[100];
char time_string[100];

time(&curr_time);
curr_tm = localtime(&curr_time);

strftime(date_string, 50, "今天是 %B %d, %Y", curr_tm);
strftime(time_string, 50, "当前时间是 %T", curr_tm);

cout << date_string << endl;
cout << time_string << endl;

return 0;
}

当你运行程序时,输出将是:

今天是 202411
当前时间是 11:20:42