不能。system_clock::now() 返回 time_point,需用 duration_cast 转换 time_since_epoch() 得毫秒 count() 值;不可用 static_cast 或 to_time_t;测间隔应选 steady_clock,且 system_clock 实际分辨率未必达 1ms。

system_clock 能直接返回毫秒吗?
不能。std::chrono::system_clock::now() 返回的是 time_point,底层通常以纳秒或微秒为单位(取决于实现),但不保证是毫秒。想得到毫秒值,必须显式转换——不是靠“取整”或“截断”,而是用 duration_cast 进行安全的时长换算。
正确获取毫秒时间戳的写法
最常用、也最推荐的方式是转成 milliseconds duration,再调用 count():
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch()).count();
注意三点:
-
time_since_epoch()才是真正返回从纪元开始的duration,now()本身是time_point - 必须用
duration_cast,不能用static_cast或 C 风格强转,否则可能丢失精度或触发未定义行为 -
count()返回的是long long类型的毫秒数(自 1970-01-01 00:00:00 UTC 起),不是浮点数
为什么不用 time_t + millisecond 修正?
有人尝试先转 time_t,再用 std::chrono::system_clock::to_time_t(now),再手动补毫秒——这既多余又易错:
立即学习“C++免费学习笔记(深入)”;
-
to_time_t只保留秒级精度,毫秒信息直接丢弃 - 跨平台时区/闰秒处理不可控,
time_t语义模糊(POSIX 要求是秒数,但不代表 UTC) - 重复构造
time_point再转回,性能无优势,还引入浮点误差风险
要注意 clock 稳定性与精度差异
system_clock 是系统实时时钟,受 NTP 调整、手动校时影响,不适合测间隔;如果只想要单调递增的毫秒计数(比如性能打点),该用 steady_clock:
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()).count();
但注意:steady_clock 的 epoch 是未指定的起始点,返回值不能当 Unix 时间戳用;而 system_clock 的 epoch 固定是 UTC 1970,适合日志打标、网络协议交互等场景。
毫秒精度在多数桌面/服务器环境够用,但嵌入式或实时系统中,system_clock 实际分辨率可能只有 10–15ms(Windows 上常见),别假设它总能稳定输出精确到 1ms 的值。


















