clock_gettime(clock_realtime, &ts) 是首选,因其直接填充纳秒级 timespec 结构、避免手动进位错误,毫秒值为 ts.tv_sec * 1000 + ts.tv_nsec / 1000000;须检查返回值、禁用 clock_monotonic 替代真实时间。

为什么 clock_gettime(CLOCK_REALTIME, ...) 是首选
因为 gettimeofday() 返回的是 struct timeval,要转成 struct timespec 得手动算毫秒进位,容易出错;而 clock_gettime(CLOCK_REALTIME, &ts) 直接填满 struct timespec,纳秒精度,取毫秒只需整除 1000000。Linux 和主流 POSIX 系统都支持,比 std::chrono 更轻量、无构造开销,适合嵌入式或性能敏感场景。
如何正确初始化并获取毫秒级时间戳
关键不是“四舍五入”,而是截断纳秒部分再换算——毫秒值应为 ts.tv_sec * 1000 + ts.tv_nsec / 1000000。注意:tv_nsec 范围是 [0, 999999999],除法用整除即可,不需 round() 或 % 校正。
示例代码:
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == 0) {
long long milliseconds = static_cast<long long>(ts.tv_sec) * 1000LL
+ ts.tv_nsec / 1000000LL;
// milliseconds 即当前时间自 Epoch 起的毫秒数
}</long>
常见错误:误用 CLOCK_MONOTONIC 或忽略返回值
CLOCK_MONOTONIC 不对应系统时钟,不能用于计算“当前时间”(比如日志打点、HTTP Date 头),它只保证单调递增;CLOCK_REALTIME 才是真实墙钟时间。另外,clock_gettime() 可能失败(如内核不支持该 clock ID),必须检查返回值是否为 0,否则 ts 内容未定义。
- 不要写
clock_gettime(CLOCK_MONOTONIC, &ts)代替真实时间 - 不要省略
if (clock_gettime(...) != 0)错误处理 - 不要把
tv_nsec直接当毫秒用(它单位是纳秒)
跨平台兼容性提醒:Windows 上不可直接用
Windows 没有原生 clock_gettime,MSVC 2015+ 提供了有限封装(需定义 _USE_32BIT_TIME_T 且仅支持 CLOCK_REALTIME),但行为不稳定;MinGW-w64 通常通过 GetSystemTimeAsFileTime 模拟,精度可能降为 15ms。若需真正跨平台,建议封装一层:Linux/macOS 走 clock_gettime,Windows 用 GetSystemTimePreciseAsFileTime(Win8.1+)并手动转 struct timespec。
最易被忽略的一点:即使在同一 Linux 系统上,不同内核版本对 CLOCK_REALTIME 的实现细节(如是否受 NTP 调整影响)也可能不同,如果业务依赖严格单调或跳变容忍度低,得额外加逻辑检测 tv_sec 回退。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











