c++oding="utf-8" ?>
获取毫秒级时间戳需用std::chrono::duration_cast转换system_clock::now()的time_since_epoch()为毫秒并调用count();生成带毫秒的iso字符串在c++20中用std::format拼接秒部分与ms%1000补零,在c++11/17中用std::ostringstream和std::put_time配合localtime_s/localtime_r实现。

用 std::chrono 获取毫秒级时间戳整数
毫秒级时间戳本质是自 Unix 纪元(1970-01-01 00:00:00 UTC)起经过的毫秒数,std::chrono::system_clock::now() 是最直接的来源。注意它返回的是 time_point,需转换为 milliseconds 持续时间再取 count():
auto now = std::chrono::system_clock::now(); auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();</:chrono::milliseconds>
这里必须用 duration_cast,不能直接 static_cast —— 否则在某些标准库实现(如 libstdc++)下会截断精度,导致结果少三位(变成秒级)。
用 std::format(C++20)生成带毫秒的 ISO 格式字符串
C++20 的 std::format 支持 {:%Y-%m-%d %H:%M:%S} 这类格式说明符,但原生不支持毫秒字段。解决办法是手动拼接:
- 先用
std::chrono::system_clock::to_time_t转成秒级time_t,再用std::gmtime或std::localtime解析为tm - 用
std::format格式化年月日时分秒部分 - 单独计算毫秒:用前面得到的
ms % 1000,并补零到三位
示例(本地时区):
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();
auto sec = ms / 1000;
auto ms_part = ms % 1000;
std::time_t t = sec;
std::tm tm_buf{};
#ifdef _WIN32
localtime_s(&tm_buf, &t);
#else
localtime_r(&t, &tm_buf);
#endif
std::string s = std::format("{:%Y-%m-%d %H:%M:%S}.{:03d}", tm_buf, ms_part);</:chrono::milliseconds>
注意 localtime 在 Windows 和 POSIX 下线程安全性不同,务必用 localtime_s 或 localtime_r。
兼容 C++11/14/17:用 std::put_time + 手动拼接毫秒
老标准没有 std::format,只能靠 std::ostringstream 和 std::put_time。关键点在于:不能对整个 time_point 直接 put_time,必须先转 time_t 和 tm:
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(now.time_since_epoch()).count();
auto sec = ms / 1000;
auto ms_part = ms % 1000;
std::time_t t = sec;
std::tm tm_buf{};
#ifdef _WIN32
localtime_s(&tm_buf, &t);
#else
localtime_r(&t, &tm_buf);
#endif
std::ostringstream oss;
oss
<p>记得包含 <code><iomanip></iomanip></code> 以使用 <code>std::setfill</code> 和 <code>std::setw</code>;否则 <code>ms_part</code> 可能输出为 <code>12</code> 而非 <code>012</code>。</p>
<h3>时区陷阱:UTC 还是本地时间?</h3>
<p><code>std::system_clock</code> 本身是 UTC,但 <code>std::localtime</code>(或 <code>localtime_r</code>)会按当前系统时区偏移。如果需要严格 UTC 字符串,改用 <code>std::gmtime_r</code>(POSIX)或 <code>gmtime_s</code>(Windows):</p>
<ul>
<li>UTC 输出示例: <code>"2024-05-21 12:34:56.789"</code>(无夏令时/本地偏移干扰)</li>
<li>本地时间示例:可能变成 <code>"2024-05-21 20:34:56.789"</code>(东八区)</li>
</ul>
<p>真正容易被忽略的是:跨平台代码里,<code>std::localtime</code> 在 Windows 上不是线程安全的,而 Linux 下 <code>localtime</code> 返回静态缓冲区指针——不加 <code>_r</code> 或 <code>_s</code> 版本,多线程调用会互相覆盖。这个坑比格式本身更致命。</p></:chrono::milliseconds>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











