std::chrono::steady_clock不能用于获取Unix纳秒时间戳,因其返回的是相对于内部起点的单调时长;应使用system_clock::now()配合duration_cast获取UTC纳秒时间戳。

std::chrono::steady_clock 不能直接用于纳秒时间戳
很多人看到 std::chrono::steady_clock 支持纳秒精度,就以为它能返回“系统当前纳秒时间戳”,但这是误解。steady_clock 是单调递增的(不随系统时间调整跳变),它的 time_since_epoch() 返回的是相对于其内部起始点的时长,不是 Unix 时间戳(即不是自 1970-01-01 00:00:00 UTC 的纳秒数)。真正需要的是 wall-clock 时间,且带纳秒精度。
用 std::chrono::system_clock::now() + duration_cast 获取纳秒时间戳
system_clock 才对应系统实时时钟,其 time_point 默认以纳秒为单位(具体取决于实现,但 C++20 要求至少微秒,主流编译器如 GCC/Clang 在 x86_64 上实际提供纳秒分辨率)。关键是要显式转成纳秒级整数:
#include <chrono>
#include <iostream><p>int main() {
auto now = std::chrono::system_clock::now();
auto nanos = std::chrono::duration_cast<:chrono::nanoseconds>(
now.time_since_epoch()).count();
std::cout </:chrono::nanoseconds></p></iostream></chrono>
- 必须用
duration_cast<:chrono::nanoseconds>,不能依赖auto推导隐式精度——不同平台system_clock::duration可能是nanoseconds、microseconds或更粗粒度 - 调用
.count()得到的是long long类型纳秒数值,可直接用于日志、性能打点或序列化 - 注意:该值是 Unix 纳秒时间戳(UTC),但
system_clock在某些旧系统或嵌入式平台可能不支持纳秒,需实测验证
Windows 下 GetSystemTimeAsFileTime 的纳秒换算陷阱
在 Windows 上,GetSystemTimeAsFileTime 返回的是 FILETIME(100 纳秒为单位,自 1601-01-01),要转成 Unix 纳秒时间戳需手动偏移:
ULARGE_INTEGER ft; GetSystemTimeAsFileTime(&ft); // FILETIME 是 100ns 单位,减去从 1601 到 1970 的 100ns 数量(116444736000000000LL) auto unix_nanos = (ft.QuadPart - 116444736000000000LL) * 100;
- 这个常量
116444736000000000LL容易写错(少一个 0 或符号错误),建议定义为 const - FILETIME 分辨率通常为 10–15ms,即使换算成纳秒也只是“末尾补零”,不代表真实纳秒精度
- 跨平台项目优先用
std::chrono::system_clock,仅在需要绕过 C++ 标准库实现缺陷(如某些 MinGW 版本)时才手撸 FILETIME
Linux 上 clock_gettime(CLOCK_REALTIME, ...) 的兼容性细节
POSIX 方案更底层、可控,但要注意:CLOCK_REALTIME 受系统时间调整影响(NTP 步进或 slew),而 CLOCK_MONOTONIC 不受影响但不是 Unix 时间戳。若坚持用系统调用:
struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); long long nanos = ts.tv_sec * 1000000000LL + ts.tv_nsec;
-
tv_nsec范围是 [0, 999999999],必须乘以 10⁹ 再加,不能直接拼接字符串 - 部分老内核(CLOCK_REALTIME 的纳秒精度,
tv_nsec可能恒为 0;可用clock_getres()检查实际分辨率 - glibc 封装的
std::chrono::system_clock::now()底层多数就调用这个,除非你有特殊时钟源需求,否则无需重复造轮子
真正的难点不在“怎么写”,而在确认你的目标平台是否真能提供纳秒级 wall-clock 时间——大多数 x86_64 Linux 和 macOS 可以,Windows 普遍只能到 15ms,嵌入式或容器环境更要实测 system_clock::period::num / period::den。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











