最直接方式是用 std::time(nullptr) 获取 time_t 时间戳,再用 std::localtime() 转为 Struct tm;但该函数非线程安全、结果存于静态缓冲区,多线程或多次调用会相互覆盖,应改用 localtime_r(POSIX)或 localtime_s(windows);格式化推荐 std::strftime 而非手动拼接,注意年份需加1900、月份加1;c++20 可用 std::chrono::system_clock::now() 配合 std::format,但兼容性有限,fallback 仍需 strftime;UTC 时间应使用 std::gmtime(),并可用 “%Y-%m-%dT%H:%M:%SZ” 生成 ISO 8601 格式。

用 std::time + std::localtime 获取本地当前日期时间
最直接的方式是调用 C 标准库的 time() 获取秒级时间戳,再用 localtime() 转为可读结构体。注意 localtime() 返回的是 struct tm*,且结果存储在静态缓冲区中,**不可多线程直接共用**。
常见错误:直接对 localtime() 返回值做多次连续调用,后一次会覆盖前一次内容(比如想同时打印“今天”和“明天”的日期)。
-
std::time(nullptr)返回从 1970-01-01 00:00:00 UTC 开始的秒数(time_t类型) -
std::localtime()把它转成本地时区的tm结构,tm.tm_year是从 1900 年起算,tm.tm_mon从 0 开始(0 表示 1 月) - 若需线程安全,改用
localtime_r()(POSIX)或localtime_s()(windows)
用 sprintf 或 std::strftime 格式化输出日期字符串
std::strftime() 是专为 tm 结构设计的格式化函数,比手拼字符串更可靠、支持时区符号(如 %Z)、自动补零等。别用 sprintf 直接格式化 tm 成员——容易漏掉 +1900、+1 等偏移,也难处理宽字符或 locale。
典型格式符:%Y(4 位年),%m(01–12),%d(01–31),%H:%M:%S(时分秒)。注意 %y 是两位年(如 24),%Y 是四位(2024)。
立即学习“C++免费学习笔记(深入)”;
- 缓冲区大小要留足,例如
char buf[64]足够放完整日期时间加时区 -
strftime()返回实际写入字符数(不含结尾