最直接方法是用std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())获取秒级Unix时间戳;需毫秒级则用duration_cast<ms>(now.time_since_epoch()).count()。

用 std::chrono::system_clock 获取 Unix 时间戳最直接
Unix 时间戳本质是自 1970-01-01 00:00:00 UTC 起的秒数(或毫秒等),C++11 起推荐用 std::chrono::system_clock,它保证映射到系统实时时钟,且可转为 time_t。
常见错误是直接用 std::time(nullptr) 得到秒级时间,但丢失毫秒精度;或误以为 std::chrono::steady_clock 能返回绝对时间(它不能,只适合测间隔)。
-
std::chrono::system_clock::now().time_since_epoch().count()返回的是纳秒/微秒/毫秒等单位的整数,具体取决于实现(通常是纳秒),需除以对应倍数才能得到秒或毫秒时间戳 - 更稳妥的做法是转成
time_t:用std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()),得到秒级时间戳(time_t类型,通常为long或int64_t) - 若需毫秒级时间戳(如日志、网络协议常用),推荐:
auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
std::time_t 和 std::chrono::time_point 互转要注意时区与精度
std::time_t 是 C 风格的秒级时间表示,不带时区信息,但 std::localtime / std::gmtime 解析时会按本地或 UTC 解释;而 std::chrono::system_clock::time_point 是纯数值偏移,底层依赖 time_t,但转换过程不自动处理时区。
- 从
time_t转std::chrono::time_point:用std::chrono::system_clock::from_time_t(t)—— 这个结果代表同一时刻的 UTC 时间点(system_clock始终以 UTC 为基准) - 反向转换(
time_point→time_t)用to_time_t(),结果仍是秒级 UTC 时间戳,和std::time(nullptr)一致 - 不要用
std::chrono::system_clock::to_time_t(tp)后再传给std::localtime()试图“还原本地时间”——这不是转换问题,而是显示逻辑,应单独调用std::localtime(&t)
计时用 std::chrono::steady_clock,别混用 system_clock
做性能测量、超时控制、循环等待时,必须用 std::chrono::steady_clock,因为它不受系统时间调整(如 NTP 校正、手动改系统时间)影响;而 system_clock 可能回跳或跳变,导致 duration 计算出负值或异常大值。
立即学习“C++免费学习笔记(深入)”;
- 正确计时模式:
auto start = std::chrono::steady_clock::now(); // ... work ... auto end = std::chrono::steady_clock::now(); auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
-
steady_clock无法转time_t或表示日历时间,它的now()返回值仅用于差值计算 - 某些平台(如 Windows)上
steady_clock和high_resolution_clock可能是同一类型,但标准不保证,别依赖high_resolution_clock—— 它可能退化为system_clock
Windows 下 GetSystemTimeAsFileTime 不推荐用于跨平台时间戳
虽然 Windows API 提供高精度的 GetSystemTimeAsFileTime(返回 100 纳秒精度的 FILETIME),但它基于 Windows 纪元(1601-01-01),换算麻烦,且与 POSIX 时间模型不兼容。强行用会导致:
- 跨平台代码出现条件编译分支,增加维护成本
- 精度虽高,但若只需毫秒/微秒级,
std::chrono::system_clock在主流平台(Linux/macOS/Windows)均已足够精确(通常微秒级) - FILETIME 到 Unix 时间戳需减去 116444736000000000LL(1601→1970 的 100ns 单位差),易出错
除非你正在写内核驱动或必须对接旧 Win32 接口,否则坚持用 std::chrono 是更简单、更安全的选择。
真正容易被忽略的是:不同 time_point 类型之间不能直接相减(比如 steady_clock::time_point 减 system_clock::time_point),编译器会报错;而 time_t 和 chrono 之间的转换看似简单,但一旦涉及本地时区显示,就必须在转换后额外调用 localtime 或 gmtime,而不是指望 clock 类型自己“带时区”。










