c++oding="utf-8" ?>
能,std::chrono::steady_clock在windows下基于queryperformancecounter,分辨率约100纳秒,远超微秒需求;但它仅适用于测间隔,不可用于日志或对时,因无utc对齐且起点未指定。

Windows 下 std::chrono::steady_clock 能否直接获取微秒精度?
能,但要注意:它返回的是自某个未指定起点的纳秒/微秒计数值,不是系统时间戳;且 Windows 实现中 steady_clock 通常基于 QueryPerformanceCounter,分辨率可达 ~100 ns,远高于微秒需求。关键不是“能不能”,而是“要不要用它来替代 GetSystemTimeAsFileTime”。
常见误用是拿 steady_clock 去做日志时间戳或跨进程对时——它不随系统时间调整,也不保证与 UTC 对齐,纯用于测量间隔最安全。
- 测耗时(如函数执行时间)→ 用
steady_clock,可靠、高精度、无漂移 - 打日志、记录事件发生时刻、和外部系统对时 → 必须用系统时间源,如
GetSystemTimeAsFileTime
用 GetSystemTimeAsFileTime 转微秒时间戳的正确姿势
GetSystemTimeAsFileTime 返回的是 Windows FILETIME(64 位,单位为 100 纳秒),从 1601-01-01 UTC 开始计数。转微秒只需除以 10,但必须用整数运算避免浮点误差,且注意溢出风险(FILETIME 最大值约到 30827 年,实际无问题)。
FILETIME ft; GetSystemTimeAsFileTime(&ft); ULONGLONG us = (static_cast<ulonglong>(ft.dwHighDateTime) <ul> <li>必须组合 <code>dwHighDateTime</code> 和 <code>dwLowDateTime</code> 成 64 位整数,不能只读 <code>dwLowDateTime</code> </li> <li>除法用 <code>/= 10</code>,不是 <code>* 0.1</code> 或 <code>/ 10.0</code>,否则可能触发隐式浮点转换,丢失精度</li> <li>该值是“自 1601 年起的微秒数”,若需 Unix 时间戳(自 1970 年起),要减去 11644473600000000ULL(即 1970-1601 年的 100ns 数),再 /10 得微秒</li> </ul> <h3>为什么不用 <code>std::chrono::system_clock::now()</code>?</h3> <p>在 MSVC(尤其是 19.20+)和较新 Windows 版本上,<code>system_clock::now()</code> 底层确实调用了 <code>GetSystemTimeAsFileTime</code>,理论上可用。但问题在于:</p> <ul> <li>标准未规定其精度,某些旧版 libc++ 或 MinGW 实现可能只到毫秒级</li> <li>MSVC 的 <code>system_clock</code> 在 Windows 7 及更早系统上会 fallback 到 <code>GetTickCount64</code>(毫秒级),无法满足微秒需求</li> <li>即使当前能返回微秒,也无法保证 <code>time_since_epoch().count()</code> 单位一定是纳秒或微秒——不同 STL 实现有差异</li> </ul> <p>所以,依赖 <code>system_clock</code> 获取微秒时间戳属于“看运气”,不如直调 Win32 API 稳定。</p> <h3>容易被忽略的时区与夏令时陷阱</h3> <p><code>GetSystemTimeAsFileTime</code> 返回的是 UTC 时间,不是本地时间。如果你直接用它生成“2024-05-20 14:30:00.123456”这类字符串,却没说明时区,后续解析或比对会出错。</p> <ul> <li>日志中建议统一用 UTC 微秒时间戳(如 <code>1716215400123456</code>),或明确标注 <code>UTC</code> </li> <li>若必须输出本地时间,先用 <code>FileTimeToLocalFileTime</code> 转换,再拆解为年月日时分秒——但此时微秒部分不变,仅时区偏移影响日期/小时字段</li> <li>夏令时切换瞬间,本地时间可能重复或跳过一秒,但 FILETIME(UTC)始终线性递增,无此问题</li> </ul> <p>真正难的不是算出微秒数,而是让所有模块对“这个数字代表什么时间、在哪种时区下解释”达成一致。一旦混用 UTC 和本地时间戳,排查起来比精度问题更费劲。</p></ulonglong>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











