现代C++推荐用std::chrono::system_clock::now()获取毫秒级时间戳,转换为自1970-01-01 UTC起的毫秒数;std::time(nullptr)仅支持秒级且有2038年风险;避免非跨平台函数如gettimeofday()。

用 std::chrono::system_clock::now() 获取毫秒级时间戳
现代 C++ 推荐用 std::chrono,它跨平台、类型安全、无时区歧义。直接调用 std::chrono::system_clock::now() 得到一个 time_point,再转换为自纪元(1970-01-01 00:00:00 UTC)起的毫秒数:
auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
now.time_since_epoch()).count();
注意:count() 返回的是 long long 类型整数,不是浮点数;若需秒级,把 milliseconds 换成 seconds 即可。
用 std::time(nullptr) 获取秒级时间戳(兼容旧代码)
这是 C 风格做法,返回 time_t,本质是自纪元起的秒数。简单直接,但精度只有秒,且 time_t 在某些旧平台可能是 32 位(2038 年问题):
std::time_t t = std::time(nullptr);
常见误用:std::time(0) 虽然能工作,但 nullptr 更明确表达“不关心输出缓冲区”;另外别对 time_t 做算术假设——它不保证是整数类型(尽管几乎所有实现都是)。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
避免用 gettimeofday() 或 clock_gettime()
这两个是 POSIX 函数,Linux/macOS 可用,但 Windows 不原生支持,引入条件编译会增加维护成本。除非你明确需要微秒/纳秒级精度,或必须绑定到某个时钟源(如 CLOCK_MONOTONIC),否则没必要绕开 std::chrono。
典型陷阱:
-
gettimeofday()的struct timeval中tv_sec和tv_usec需手动拼接,易出错 -
clock_gettime(CLOCK_REALTIME, ...)返回值是纳秒级,但不同系统对纳秒字段的范围定义不一致(比如 Linux 是 0–999999999,而某些嵌入式实现可能只支持毫秒)
注意时区与线程安全
std::chrono::system_clock::now() 返回的是 UTC 时间戳,和本地时区无关——这点常被误解。它本身是线程安全的,但如果你把它转成 std::tm 再格式化(比如用 std::gmtime 或 std::localtime),就要小心:std::localtime 返回静态缓冲区指针,多线程下不安全;应改用 std::localtime_r(POSIX)或 _localtime64_s(MSVC)。
真正容易被忽略的点:Windows 上 system_clock 的分辨率可能低至 15ms(取决于系统计时器策略),而 Linux 通常能到微秒级;如果做高精度测量,别依赖 system_clock::now() 的相邻两次调用差值。

















