推荐用 std::chrono 获取毫秒级时间戳:调用 system_clock::now() 后用 duration_cast 转换并调 count() 得 long long 类型毫秒数;time() 仅适用于秒级且需兼容旧环境;避免 gettimeofday 和 clock_gettime 等非标准 posix 接口;时间戳是纯数字,非格式化字符串。

用 std::chrono 获取毫秒级时间戳(推荐)
现代 C++ 最稳妥的方式是用 std::chrono,它跨平台、类型安全、无时区歧义。时间戳默认是自 Unix epoch(1970-01-01 00:00:00 UTC)起的毫秒数。
关键点:
-
std::chrono::system_clock::now()返回当前时间点,不是整数,需转换 - 用
time_since_epoch().count()提取底层计数值,单位取决于时钟的period -
system_clock通常以纳秒或微秒为单位,直接调count()可能溢出或精度错乱,应显式转成毫秒
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<:chrono::milliseconds>(
now.time_since_epoch()).count();
// ms 是 long long 类型的毫秒时间戳
</:chrono::milliseconds>
用 time() 获取秒级时间戳(兼容旧代码)
如果只要秒级精度,且需兼容 C 风格或嵌入式环境(std::chrono 支持不全),可用 time() 函数。
注意:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
time(nullptr)返回time_t,在大多数系统上是秒级整数,但标准未规定其单位或符号位,不能假设一定是 64 位有符号整数 - Windows 上 VC++ 的
time_t默认是 64 位,但老版本 MinGW 可能仍是 32 位,2038 年问题仍需警惕 - 不要对
time_t做算术运算后直接强转,应先用std::difftime或转成std::chrono::seconds
time_t t = time(nullptr); // 安全转成秒级 long long(避免隐式截断) auto seconds = static_cast<long long>(t); </long>
避免用 gettimeofday() 或 clock_gettime()
这两个是 POSIX C 接口,虽常见于 Linux/macOS,但不是 C++ 标准,Windows 不原生支持,且语义易混淆:
-
gettimeofday()返回的是 wall-clock 时间,但结构体struct timeval的tv_sec和tv_usec需手动拼接,容易写错进位逻辑 -
clock_gettime(CLOCK_REALTIME, ...)精度高,但CLOCK_REALTIME可被系统管理员调整(NTP 跳变),不适合做单调性要求高的场景 - 二者都依赖头文件
<sys></sys>或<time.h></time.h>,破坏可移植性;C++20 引入std::chrono::utc_clock后才更接近其语义
时间戳字符串格式化不是“获取时间戳”
很多人搜“C++ 时间戳”实际想要的是类似 "2024-05-20 14:23:15" 这种字符串——这不属于时间戳,而是本地时间的格式化输出,和 Unix 时间戳(纯数字)是两回事。
若真需要字符串:
- 别用
ctime():返回静态缓冲区指针,多线程不安全,且带换行符、固定格式不可控 - 优先用
std::format(C++20)或std::put_time(C++11 起),配合std::chrono::system_clock::to_time_t()转换 - 注意:
to_time_t()丢弃亚秒精度,且结果受本地时区影响,和原始时间戳数值不等价
真正的时间戳就是那个数字——它没时区、没格式、不依赖 locale,拿来存数据库、算差值、发网络协议最干净。别把它和显示混淆。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










