应根据用途选择:需挂钟时间用system_clock,测耗时用steady_clock;转毫秒必须用duration_cast,不可直接除法;windows下steady_clock分辨率可能退化至15ms。

用 std::chrono::steady_clock 还是 std::chrono::system_clock?
获取“当前时间”要看你要的是挂钟时间(比如日志打点、和外部系统对时),还是纯粹的耗时测量。前者必须用 std::chrono::system_clock,后者推荐 std::chrono::steady_clock(不随系统时间调整跳变)。毫秒精度两者都支持,但 system_clock 才能转成可读时间戳。
time_point 转毫秒整数要小心截断和溢出
直接调 .time_since_epoch().count() 得到的是纳秒或微秒级原始计数(取决于实现),不是毫秒。必须显式转换,否则可能溢出或精度丢失:
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(
now.time_since_epoch()).count(); // ✅ 正确:转为毫秒整数
</:chrono::milliseconds>
- 别写
now.time_since_epoch().count() / 1000000—— 除法截断风险高,且单位依赖底层实现(有些平台是微秒) - 返回值类型是
long long,32 位系统下注意是否够存(2038 年问题不在此处,但超长运行程序仍需留意)
Windows 下 steady_clock 的实际分辨率可能只有 15ms
虽然标准不保证,但 Windows 默认的 steady_clock 基于 QueryPerformanceCounter,通常能到微秒级;然而如果系统启用了节能策略或老旧硬件,实测分辨率可能退化到 15–16ms。验证方法:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
auto a = std::chrono::steady_clock::now(); auto b = std::chrono::steady_clock::now(); auto diff = std::chrono::duration_cast<:chrono::microseconds>(b - a).count(); // 多次运行看最小非零 diff 是否稳定在 ~1000μs 以下 </:chrono::microseconds>
- Linux/macOS 一般没问题(基于 clock_gettime(CLOCK_MONOTONIC))
- 若需稳定亚毫秒精度,Windows 上建议用
QueryPerformanceCounter直接调用(绕过 chrono 封装)
跨平台获取系统时间毫秒整数的稳妥写法
只依赖标准库、不引入第三方、又想兼容各平台,就用 system_clock + 显式 duration_cast:
auto now = std::chrono::system_clock::now();
auto ms_since_epoch = std::chrono::duration_cast<:chrono::milliseconds>(
now.time_since_epoch()).count();
</:chrono::milliseconds>
- 这个值是自 Unix epoch(1970-01-01 00:00:00 UTC)起的毫秒数,和 JavaScript
Date.now()、Pythontime.time() * 1000对齐 - 注意:
system_clock::to_time_t(now)是秒级,不能替代上面的毫秒计算 - 如果只需要相对差值(如函数执行耗时),优先用
steady_clock,避免系统时间被 NTP 调整导致负值
真正容易被忽略的是:毫秒值本身没有时区信息,system_clock 返回的是 UTC 时间点,转本地时间要额外处理 std::chrono::zoned_time(C++20)或用 gmtime_r/localtime_s 配合 time_t。别默认以为 count() 出来的数字就是你本地墙上钟显示的毫秒。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










