“毫秒偏移值”实为自unix纪元起的毫秒级时间戳,非时区偏移;用std::chrono::system_clock::now().time_since_epoch()转毫秒并count()获取,结果是utc时间的int64_t整数。

什么是“毫秒偏移值”?先确认你要的到底是什么
很多人搜“毫秒偏移值”,实际想的是:当前时间距离某个基准时间(比如 Unix 纪元 1970-01-01 00:00:00 UTC)的毫秒数。这不是时区偏移(如 +0800),而是时间戳的毫秒精度表示。
C++ 标准库里没有直接叫“毫秒偏移值”的函数,但 std::chrono 可以精确做到。关键在于选对时钟和单位转换逻辑。
std::chrono::system_clock::now() 是最常用起点
std::chrono::system_clock 对应系统实时时钟(通常同步于 UTC),它的 now() 返回一个 time_point,底层是纳秒或微秒精度,具体取决于平台实现。
要得到毫秒级 Unix 时间戳(即自纪元起的毫秒数),得:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 将
time_point转换为duration相对于纪元 - 再用
count()提取整数值
#include <chrono> #include <iostream><p>auto now_ms = std::chrono::duration_cast<:chrono::milliseconds>( std::chrono::system_clock::now().time_since_epoch() ).count(); std::cout </:chrono::milliseconds></p></iostream></chrono>
- 这个值是 带符号的 long long,跨平台安全
- 不要用
std::chrono::steady_clock—— 它不保证对应纪元,不能用于时间戳 - Windows 上
system_clock可能只到 15.6ms 精度(旧版),但duration_cast仍会返回正确毫秒数(向下取整)
注意时区:这个值默认是 UTC,不是本地时间
std::chrono::system_clock::now() 返回的是系统报告的 UTC 时间点(即使系统时区设为上海,它也不自动加 8 小时)。所以:
- 如果你只是要“唯一、可比较、持久化存储”的时间标识,直接用上面的结果即可
- 如果你误以为这是“本地时间毫秒数”,后续做日期格式化时可能出错(比如用
gmtime()解析却当成本地时间用)
需要本地时间对应的毫秒数?别转——先明确需求:
- 存数据库、发网络请求 → 一律用 UTC 毫秒(推荐)
- 显示给用户看 → 用
std::chrono+std::format(C++20)或localtime_r(POSIX)转换,而不是改时间戳本身
兼容 C++11 且避免依赖 std::format
C++11 到 C++17 用户没法用 std::format 做高阶格式化,但获取毫秒时间戳完全够用:
-
std::chrono::duration_cast和time_since_epoch()在 C++11 就已稳定 - 不要手写除法(比如
/ 1000000)来转毫秒:容易溢出、类型不匹配、丢失精度 - 推荐封装成函数,避免每次重复写模板:
inline int64_t now_ms() {
return std::chrono::duration_cast<:chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()
).count();
}
</:chrono::milliseconds>
- 返回
int64_t更明确,比auto在跨平台编译时更可控 - 某些嵌入式平台或老编译器(如 GCC 4.8)不支持
std::chrono::milliseconds::rep为int64_t,这时显式强转更稳妥
毫秒时间戳看着简单,但混淆 UTC/本地、乱用时钟类型、忽略精度截断,是线上服务里几类典型时间相关 bug 的源头。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










