16位时间戳指从Unix纪元起的微秒数,如1630502400000000,需用std::chrono::system_clock::now()减去from_time_t(0)再转microseconds::count()获取,避免使用已废弃的gettimeofday或精度不足的std::time。

时间戳16位是什么意思?先搞清需求
16位数字的时间戳,通常指从某个起点(比如 Unix 纪元 1970-01-01 00:00:00 UTC)开始经过的微秒数,共16位十进制数。但要注意:1630502400000000 是典型的16位微秒时间戳(对应 2021-03-01 00:00:00.000000),而 1630502400 是10位秒级时间戳——两者差6个数量级。如果你看到“16位”,大概率是要微秒精度,不是指字符串长度硬截成16位。
用 std::chrono::system_clock 获取微秒级时间戳
C++11 起,std::chrono 是最可靠的方式,避免平台相关 API(如 gettimeofday 或 QueryPerformanceCounter)。关键点是:必须用 std::chrono::microseconds 作为单位,且起点必须是 std::chrono::system_clock::time_point::min() 对应的 Unix 纪元(标准保证 system_clock 基于 Unix 时间)。
实操建议:
- 用
std::chrono::system_clock::now()获取当前时间点 - 减去
std::chrono::system_clock::from_time_t(0)得到距 Unix 纪元的持续时间 - 用
std::chrono::duration_cast<:chrono::microseconds>()</:chrono::microseconds>转换为微秒 - 调用
.count()得到int64_t类型的微秒数值(典型值如1717023456789012)
auto now = std::chrono::system_clock::now(); auto epoch = std::chrono::system_clock::from_time_t(0); auto us = std::chrono::duration_cast<std::chrono::microseconds>(now - epoch); int64_t timestamp_us = us.count(); // 这就是你要的16位微秒时间戳(通常是16或17位整数)
为什么不用 std::time(nullptr) 或 gettimeofday?
std::time(nullptr) 只返回秒级,精度不够;gettimeofday 虽支持微秒,但已被标记为废弃(POSIX.1-2008),且在 Windows 上不可用。更严重的是:某些 libc 实现(如 musl)的 gettimeofday 微秒字段可能不准确,或被截断为毫秒。而 std::chrono::system_clock 在主流编译器(GCC/Clang/MSVC)上底层调用高精度系统时钟(CLOCK_REALTIME 或 QueryUnbiasedInterruptTime),且行为标准化。
立即学习“C++免费学习笔记(深入)”;
注意跨平台与精度陷阱
常见错误现象:在某些旧版 MSVC(如 VS2015)或嵌入式 toolchain 中,system_clock::period 可能是 std::ratio(100 纳秒),导致 microseconds::count() 实际是 100ns 单位,再乘以 10 才得微秒——但这是极少数情况,现代标准库已统一为纳秒级分辨率、向下转换安全。
真正容易踩的坑:
- 误用
steady_clock:它不基于 Unix 纪元,不能直接转时间戳 - 忽略时区:
system_clock是 UTC,如果业务需要本地时间戳,需手动加偏移(不推荐,易错) - 用
long long接收但未声明为int64_t:在 Windows 上long是 32 位,count()可能溢出 - 打印时用
%d格式化int64_t:应使用%" PRId64或直接用std::to_string()
微秒级时间戳本质是 int64_t 整数,不是字符串。所谓“16位”只是数值范围(约公元2262年前都够用),别在生成后做字符串截断或补零——那会破坏时间语义。


















