应使用std::chrono::microseconds(123456)和std::chrono::milliseconds(123)构造字面量;time_point需通过epoch加duration或duration_cast显式构造;获取当前毫秒数须用duration_cast<ms>(now.time_since_epoch()).count()。

std::chrono 里怎么写微秒和毫秒的字面量
直接用 std::chrono::microseconds 和 std::chrono::milliseconds 构造,它们是 std::chrono::duration 的特化类型。别手写整数再除以 1000——那是 C 风格,容易溢出且语义不清。
常见错误:写 1000 * 1000 表示 1 秒,结果 int 溢出;或用 std::chrono::duration<long std::ratio>></long> 手动写比例,没必要且难读。
-
auto us = std::chrono::microseconds(123456);→ 表示 123456 微秒 -
auto ms = std::chrono::milliseconds(123);→ 表示 123 毫秒 -
auto s = std::chrono::seconds(2);→ 也可混用:us + ms自动转换(精度以右操作数为准,但推荐显式转换)
怎么从 duration 得到时间点(time_point)
std::chrono::time_point 不是“当前时间”,而是某个时钟(如 std::chrono::system_clock)的起点(epoch)起经过指定 duration 后的时刻。不能直接把毫秒数塞进 time_point 构造函数——它只接受该时钟的 duration 类型。
典型误用:std::chrono::system_clock::time_point(123ms) 编译失败,因为 system_clock::duration 通常是纳秒或微秒,不一定匹配 milliseconds。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 正确做法:用
time_point的operator+或time_point构造函数配合duration_cast auto tp = std::chrono::system_clock::time_point{} + std::chrono::milliseconds(123);- 或更安全:
auto tp = std::chrono::system_clock::time_point{std::chrono::duration_cast<:chrono::system_clock::duration>(std::chrono::milliseconds(123))};</:chrono::system_clock::duration> - 注意:
system_clock::time_point{}是 epoch(通常是 1970-01-01 00:00:00 UTC),不是“现在”
获取“现在”的时间点并转成毫秒/微秒整数
用 std::chrono::system_clock::now() 拿当前时间点,再减去 epoch 时间点,得到一个 duration,最后用 count() 提取原始数值。别用 time_t 中间转换——会丢精度、跨平台行为不一致。
常见坑:直接对 time_point 调用 count() 编译报错;或用 time_point.time_since_epoch().count() 却没注意单位(可能是纳秒)。
auto now = std::chrono::system_clock::now();-
auto us_count = now.time_since_epoch().count();→ 实际单位取决于system_clock::period,通常为纳秒(Linux/macOS)或 100ns(Windows) - 稳妥提取毫秒:
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();</:chrono::milliseconds> - 想确保是微秒:
auto us = std::chrono::duration_cast<:chrono::microseconds>(now.time_since_epoch()).count();</:chrono::microseconds>
不同 clock 的 time_point 不能混用
std::chrono::system_clock::time_point、std::chrono::steady_clock::time_point、std::chrono::high_resolution_clock::time_point 是完全不同的类型,即使都叫 time_point,也不能直接赋值或相加。编译器会报错,比如 error: no match for 'operator+'。
这不是设计缺陷,而是刻意为之——避免把 wall-clock 时间和单调时钟混用导致逻辑错误(比如拿 steady_clock 做超时判断,却误用了 system_clock 的时间点)。
- 不要写:
auto tp = std::chrono::steady_clock::now() + std::chrono::milliseconds(100);→ 这本身合法,但若之后传给期望system_clock::time_point的函数,就崩了 - 跨 clock 转换需经
time_since_epoch()+duration_cast+ 重新构造,但一般不建议——用途不同,强行转换可能失去语义 - 记住:做延时/超时用
steady_clock;做日志打点/文件时间戳用system_clock
最易被忽略的一点:system_clock::time_point 的 epoch 和精度在不同标准库实现中可能不同(尤其是 Windows 上 MSVC 的 system_clock 精度是 100 纳秒,而 libstdc++/libc++ 多为纳秒),如果代码依赖 count() 的绝对值(比如存数据库),务必先 duration_cast 到明确单位再取整。

















