获取微秒级时间戳需用std::chrono::duration_cast显式转换,避免直接除法;结果为自unix epoch起的微秒数,类型long long,跨平台安全。

获取当前时间的微秒级精度需要系统支持
标准 C++11 的 std::chrono::system_clock::now() 返回的是纳秒或微秒精度的 time_point,但实际分辨率取决于底层 OS 和硬件——Linux 上通常能到纳秒(内核 2.6.28+),Windows 上 QueryPerformanceCounter 默认约 15–25 微秒,GetSystemTimePreciseAsFileTime(Win10+)才稳定支持 100ns 级别。
所以“获取微秒偏移”本质是:先拿到高精度时间点,再换算成自某个 epoch 起的微秒数。注意,“偏移”不是时区偏移,而是时间戳的微秒单位数值。
std::chrono::duration_cast 是换算关键
不能直接用 .time_since_epoch().count() 拿原始 tick 数,因为 system_clock::period 可能是纳秒、微秒甚至更粗粒度(如某些嵌入式平台是毫秒)。必须显式转换:
auto now = std::chrono::system_clock::now();
auto us = std::chrono::duration_cast<:chrono::microseconds>(
now.time_since_epoch()
).count();
</:chrono::microseconds>
- 结果
us是自 Unix epoch(1970-01-01 00:00:00 UTC)起的微秒总数,类型为long long - 如果系统 clock 原生是纳秒级,
duration_cast会向下取整(截断),不会四舍五入 - 不建议用
auto us = now.time_since_epoch().count() / 1000——count()类型和单位未定义,跨平台不安全
Windows 下需注意 system_clock 的默认精度缺陷
MSVC 的 std::chrono::system_clock 在旧版 Windows(GetSystemTimeAsFileTime,分辨率仅 ~15ms,duration_cast<microseconds></microseconds> 后仍是阶梯状跳变,不是真微秒精度。
- 若需可靠微秒/百纳秒级,改用
GetSystemTimePreciseAsFileTime(Win10+)或QueryPerformanceCounter+QueryPerformanceFrequency手动计算 - 用
std::chrono::high_resolution_clock并不解决这个问题——它在 Windows 上常 alias 到system_clock,而非真正高精度源 - 可运行
std::chrono::system_clock::is_steady和实测连续两次now()的差值来验证实际分辨率
跨平台稳定获取微秒时间戳的最小可行方案
不依赖第三方库、不写平台分支代码的前提下,最简健壮做法就是信任 system_clock::now() + duration_cast,但接受其精度上限由系统决定:
auto us_since_epoch = std::chrono::duration_cast<:chrono::microseconds>(
std::chrono::system_clock::now().time_since_epoch()
).count();
</:chrono::microseconds>
- Linux/macOS 一般没问题;Windows 10 1607+ 也基本满足微秒需求
- 若业务要求严格单调、无回跳,应搭配
std::chrono::steady_clock,但它不提供自 epoch 起的时间,只适合测间隔 - 真正要对齐物理时间(比如日志打点、分布式 trace),还得考虑 NTP 同步状态——微秒数字再准,系统时钟漂移了也没用
微秒值本身容易拿到,难的是确认它代表什么:是 wall-clock 还是 monotonic?是否被 NTP 调整过?是否在虚拟机里被节流?这些比调用哪个函数更重要。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











