c++oding="utf-8" ?>
最推荐方式是用std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())获取秒级unix时间戳,它直接、跨平台、无时区歧义且精度可靠。

用 std::chrono 获取当前时间的 Unix 时间戳(秒级)
最推荐的方式是使用 C++11 起标准库提供的 std::chrono,它能直接得到自 1970-01-01 00:00:00 UTC 起的秒数(即 Unix 时间点),且不依赖平台、无时区歧义。
关键点在于:必须把系统时钟时间点转换为 UTC 时间点再截断到秒——std::chrono::system_clock::now() 返回的是本地实现定义的“系统时间”,但其 epoch 保证是 Unix epoch,因此只要不做时区转换,直接转成 std::time_t 就是正确的 Unix 时间戳(秒级):
auto now = std::chrono::system_clock::now(); std::time_t t = std::chrono::system_clock::to_time_t(now); // t 就是当前 Unix 时间戳(秒)
- 不要用
std::chrono::duration_cast<:chrono::seconds>(now.time_since_epoch()).count()</:chrono::seconds>—— 这会丢失精度且在某些旧编译器上可能因内部表示导致负值 -
std::time_t是整数类型,通常为long或long long,足够表达到 2106 年 - 该方式不涉及
<ctime></ctime>的localtime/gmtime,完全规避了时区和线程不安全问题
需要毫秒级 Unix 时间戳怎么办
Unix 时间戳本身是秒级的,但很多系统(如日志、网络协议)实际使用毫秒级整数。这时不能简单乘以 1000,而应从 system_clock::time_point 中提取毫秒部分:
auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count(); // ms 是自 Unix epoch 起的毫秒数(int64_t)</:chrono::milliseconds>
- 务必用
duration_cast,不是time_t;time_t只支持秒级 - 注意
count()返回的是有符号整数,32 位系统下 2038 年后会溢出,建议始终用int64_t接收 - 毫秒值是 UTC 的,与本地时区无关;如果误用
std::chrono::steady_clock则得不到 Unix 时间戳(它不关联 epoch)
为什么不用 time(nullptr)?
time(nullptr) 确实返回 std::time_t 类型的 Unix 秒数,看起来最简,但它有三个隐性风险:
- 它是 C 风格函数,返回值依赖
time_t实现,在 Windows 上可能是 64 位,Linux 上可能是 32 位(旧 glibc) - 某些嵌入式或受限环境(如 freestanding 实现)可能未提供
<ctime></ctime> - 它无法获取亚秒级精度,且没有明确的时钟源语义——
system_clock至少保证是单调递增的(实践中也基本等于 wall clock)
除非你只写兼容 C89 的极简代码,否则没必要退回到 time(nullptr)。
跨平台编译时 std::chrono::system_clock 是否可靠
是可靠的。C++11 标准强制要求 std::chrono::system_clock 的 time_since_epoch() 起点为 Unix epoch,且 to_time_t() 必须返回对应秒数。
所有主流编译器(GCC 4.8+、Clang 3.3+、MSVC 2015+)都满足这一要求。唯一要注意的是:
- MSVC 在 /clr 或 /ZW 模式下可能有异常行为,纯 native C++ 无问题
- 某些老旧 Android NDK(r10e 之前)的 libc++ 实现有 bug,但现代 NDK(r21+)已修复
- 如果你用的是 C++17,可进一步用
std::chrono::floor<:chrono::seconds>(now)</:chrono::seconds>显式向下取整,语义更清晰
真正容易被忽略的是:system_clock::now() 的分辨率因平台而异(Windows 通常 15ms,Linux 可达 1ns),但只要你只取秒或毫秒,这个差异不影响结果正确性。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











