推荐用 std::chrono::steady_clock 获取稳定毫秒数(非 unix 时间戳),用 std::chrono::system_clock 获取 unix 毫秒时间戳;避免 time(nullptr)、clock()、gettickcount64() 等平台依赖或低精度方案。

用 std::chrono::steady_clock 获取毫秒数(推荐)
std::chrono::steady_clock 是 C++11 起最稳妥的选择,它不随系统时间调整跳变,适合做间隔或相对计时。获取自某个稳定起点的毫秒数,只需转换为 std::chrono::milliseconds:
示例:
#include <chrono>
#include <iostream><p>int main() {
auto now = std::chrono::steady_clock::now();
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();
std::cout </:chrono::milliseconds></p>
<ul>
<li>返回值是 <code>long long</code> 类型,单位为毫秒,从时钟起点算起(不是 Unix 时间戳)</li>
<li>如果只想要“当前秒内”的毫秒部分(即 0–999),用 <code>ms % 1000</code>
</li>
<li>注意:<code>steady_clock</code> 不保证从程序启动开始计时,但两次调用差值一定可靠</li>
</ul>
<h3>用 <code>std::chrono::system_clock</code> 获取 Unix 毫秒时间戳</h3>
<p>如果你需要的是“自 1970-01-01 00:00:00 UTC 起的毫秒数”,也就是常说的 Unix 毫秒时间戳,应使用 <code>std::chrono::system_clock</code>:</p>
<p>示例:</p>
<pre class="brush:php;toolbar:false;">#include <chrono>
#include <ctime><p>auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();</:chrono::milliseconds></p></ctime></chrono>
- 这个
ms值可直接用于 HTTPDate头、日志时间戳、与 JSDate.now()对齐等场景 - 在 Windows 上,
system_clock::now()可能有 ~15ms 的精度限制(取决于系统计时器),Linux 通常更准(~1ms) - 不要用
time(nullptr)+ 手动乘 1000 —— 它丢掉了秒内的毫秒,且不跨平台
避免用 GetTickCount64() 或 clock_gettime() 直接裸调
Windows 的 GetTickCount64() 和 Linux 的 clock_gettime(CLOCK_MONOTONIC, ...) 虽然快,但引入平台依赖、类型处理麻烦,还容易出错:
-
GetTickCount64()返回的是自系统启动起的毫秒数,会溢出重置(约 49.7 天),不适合长期运行服务的时间基准 -
clock_gettime返回struct timespec,需手动拼接tv_sec * 1000 + tv_nsec / 1000000,易漏除法截断或溢出 - C++ 标准库的
chrono已封装好这些细节,没必要绕开
常见错误:误用 std::time(nullptr) 或 std::clock()
这两个函数完全不适合获取毫秒精度:
-
std::time(nullptr)返回time_t,通常是秒级整数,丢失全部毫秒信息 -
std::clock()返回的是 CPU 时间(非挂钟时间),单位是CLOCKS_PER_SEC,值不稳定、不可预测,且在多线程下无意义 - 试图用
gettimeofday()(已废弃)或ftime()(POSIX)也属于过时做法,chrono是唯一现代路径
毫秒精度本身在不同平台底层实现差异不小,chrono 封装了这些差异,但你得选对 clock 类型——steady_clock 用于测量,system_clock 用于打时间戳,混用会导致逻辑错乱。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











