最可靠跨平台获取毫秒级时间戳的方法是使用 std::chrono::system_clock::now() 配合 duration_cast,返回 utc 自纪元起的毫秒数 long long 值,无需平台 api、避免精度与类型错误。

用 std::chrono::system_clock 获取毫秒级时间戳最可靠
Windows 和 Linux 下都支持,且不依赖平台 API,避免了 time() 只能到秒、gettimeofday() 已废弃、QueryPerformanceCounter() 需要手动换算等问题。核心是把 system_clock::now() 转成毫秒单位的整数。
常见错误是直接用 time_t 强转或截断,导致丢失毫秒部分;或者误用 steady_clock(它不对应日历时间,不能当“当前时间戳”用)。
- 用
auto now = std::chrono::system_clock::now();获取当前时间点 - 用
std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count()</:chrono::milliseconds>得到自纪元起的毫秒数 - 注意:返回值是
long long,不是int,32 位系统下int会溢出(2038 年问题延伸)
std::chrono::system_clock 的时间精度不等于毫秒,但足够用
标准不保证 system_clock 的最小刻度是毫秒——实际取决于系统(Linux 通常纳秒级,Windows 通常 15–16ms),但 duration_cast 会向下取整到最近的毫秒,结果仍是合法的毫秒时间戳,符合绝大多数日志、网络协议、数据库写入的需求。
别试图用 nanoseconds 然后自己除 1e6:浮点运算引入误差,且无实际意义——系统本身就不提供稳定微秒级响应。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 不要写
static_cast<long long>(now.time_since_epoch().count() / 1'000'000)</long>:这是错的,count()返回的是时钟周期数,不是微秒 - 必须用
duration_cast,它处理了底层周期单位转换 - 如果真需要更高精度(比如性能分析),该用
steady_clock,但它不是“当前时间”
跨平台兼容写法,避开 Windows 的 GetSystemTimeAsFileTime
有人为“精确”改用 Win32 API,结果引入平台耦合、时区处理混乱(FILETIME 是 UTC,但容易被当成本地时间)、还要手动减去 11644473600000LL 换算纪元差——完全没必要。
std::chrono::system_clock 在 VS2015+、GCC 5+、Clang 3.7+ 均已稳定支持,且行为一致:返回 UTC 时间,毫秒值可直接用于 HTTP Date 头、ISO 8601 格式化、数据库 BIGINT 字段等场景。
- 确保编译器启用 C++11 或更高标准(
-std=c++11) - 不需要
#include <windows.h></windows.h>或<sys></sys> - 示例一行获取:
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();</:chrono::milliseconds>
注意时区和格式化不是时间戳的事
时间戳本质是 UTC 毫秒数,和时区无关。很多人混淆“获取时间戳”和“显示本地时间”,一上来就调 localtime_s 或 std::put_time,反而绕远路、引入线程不安全或 locale 依赖。
如果你最终要输出 “2024-05-21 14:32:15.123”,那是格式化阶段的事,不是获取时间戳阶段该干的。先拿到干净的 ms,再按需转本地/UTC 字符串。
- 时间戳变量名建议用
timestamp_ms,别叫now_ms或cur_time,避免语义模糊 - 若需带微秒或纳秒,只改
duration_cast目标类型,不要动system_clock——它的 epoch 和语义不变 - 嵌入式或受限环境若无
std::chrono,才考虑clock_gettime(CLOCK_REALTIME, ...),但得自己处理 struct timespec 到毫秒的转换
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










