贝利信息

c++的std::chrono库如何处理闰秒? (UTC vs TAI)

日期:2026-01-21 00:00 / 作者:尼克
std::chrono不处理闰秒,所有标准时钟均忽略闰秒,依赖外部库(如date)或手动查表实现UTC/TAI转换。

std::chrono 不处理闰秒,它基于系统时钟(通常是 UTC),但完全不感知闰秒存在。

std::chrono 的时钟类型

都不支持闰秒

所有标准时钟 —— std::chrono::system_clockstd::chrono::steady_clockstd::chrono::high_resolution_clock —— 都是单调或近似 UTC 的实现,但 C++ 标准明确回避了闰秒语义:

闰秒发生时 std::chrono 的实际行为

以 2016 年末的闰秒(UTC 23:59:60)为例:

需要 TAI/UTC 对齐时怎么办?

标准库无解,必须依赖外部数据和手动校正:

#include "date/tz.h"
using namespace date;
auto tai_tp = tai_clock::now();
auto utc_tp = utc_clock::from_tai(tai_tp); // 查表计算 UTC 偏移
std::cout << utc_tp << '\n'; // 输出含闰秒语义的 UTC 时间

真正棘手的不是“怎么转”,而是“谁负责更新闰秒表”和“系统时钟是否已 smear”。生产环境若需亚秒级 UTC 对齐(如天文、金融时间戳),不能只靠 date::utc_clock::to_sys()