贝利信息

c++中如何获取系统当前时间_c++获取当前时间戳的方法【实例】

日期:2026-01-26 00:00 / 作者:穿越時空
最可靠的方式是用 std::chrono::system_clock::now() 配合 duration_cast 转秒级时间戳,类型安全、跨平台、无符号、默认 Unix 时间戳;避免 time() 和 gettimeofday() 等 C 接口,因其存在精度低、线程不安全、32 位溢出等隐患。

直接用 std::chrono::system_clock::now() 转成秒级时间戳最可靠,别碰 time()gettimeofday() 这类 C 风格接口——它们在跨平台、精度、线程安全上都有隐性坑。

std::chrono 获取秒级时间戳(推荐)

这是 C++11 之后的标准做法,类型安全、无符号、跨平台,且默认就是 Unix 时间戳(自 1970-01-01 00:00:00 UTC 起的秒数)。

auto now = std::chrono::system_clock::now();
auto seconds = std::chrono::duration_cast(now.time_since_epoch()).count();
// seconds 是 long long 类型,即标准 Unix 时间戳(秒)

获取毫秒/微秒级时间戳(需要更高精度)

很多日志、性能打点、网络协议需要毫秒或微秒粒度。仍用 std::chrono,只换 duration_cast 的目标类型即可。

auto now = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast(now.time_since_epoch()).count();
// ms 是自 1970-01-01 起的毫秒数,可直接用于日志前缀或 HTTP Date 头构造

为什么不该用 time(nullptr)

它看似简单,但隐藏三个实际问题:

除非你在写兼容 C99 的极简嵌入式代码,否则没理由绕开 std::chrono

Windows 下特别注意 GetSystemTimeAsFileTime 的陷阱

有人查 MSDN 后直接用这个 API,结果发现值比 Unix 时间戳大 11644473600 秒——因为它返回的是自 1601-01-01 起的 100 纳秒单位数。

真正容易被忽略的,是 system_clock::time_pointtime_t 的转换在某些老编译器(如早期 GCC 4.8)里有符号扩展 bug;只要用 duration_cast 直接取 count(),就能绕过所有中间类型风险。