c++oding="utf-8" ?>
std::chrono::leap_second 在 c++20 和 c++23 中均不存在,它既非类也非函数或常量,编译器会报错“'leap_second' is not a member of 'std::chrono'”,该名称源于对已否决提案的误读,c++标准库至今未支持闰秒。

std::chrono::leap_second 在 C++20 中根本不可用
直接说结论:std::chrono::leap_second 并不存在于标准 C++(包括 C++20 和 C++23)。它既不是类、也不是函数或常量,更不是 std::chrono 的成员。你查不到它的定义,编译器会报错:error: 'leap_second' is not a member of 'std::chrono'。
这个名称可能源于对 ISO C++ 标准草案早期讨论的误读,或是混淆了提案(如 P0355R7)中曾提议但最终被否决/搁置的闰秒支持设计。C++ 标准委员会至今未将闰秒处理纳入 std::chrono —— 主要原因是闰秒本身由 IERS 动态公告、无固定周期,且多数系统(Linux、Windows)不提供可靠、实时同步的闰秒表接口,标准库选择保持“无状态时间”模型。
为什么不能像 time_t 或 tzdb 那样“查询历史闰秒”
C++20 引入了 std::chrono::tzdb 和 std::chrono::get_tzdb(),但它只包含时区规则(DST、偏移变更),**不包含闰秒信息**。IERS 发布的闰秒列表(如 leap-seconds.list)是独立文本文件,需手动下载并解析。
- IERS 官方闰秒文件地址:https://www.ietf.org/timezones/data/leap-seconds.list(注意:该文件有数字签名,需校验)
- 内容格式为 Unix 时间戳 + 闰秒累计值(例如
2789164800 10 # 1 Jan 2017),不是 C++ 原生类型 -
std::chrono::sys_time和std::chrono::utc_time在标准中仅作概念区分,utc_time的实现完全依赖外部数据库(如 ICU 或自定义解析),标准库本身不提供转换逻辑
实际可用的替代方案:手动加载 leap-seconds.list
若你真需要在 C++ 程序中查询某时刻是否插入闰秒、或计算 UTC 与 TAI 差值,只能自己解析 IERS 文件。关键点如下:
- 必须定期更新
leap-seconds.list(它会新增条目,旧条目不变) - 解析时注意注释行(以
#开头)、末尾空格、以及时间戳是基于 POSIX 时间(非std::chrono::system_clock::time_point,需转为std::chrono::seconds) - 推荐用
std::vector<:pair int>></:pair>存储(时间戳 → 累计闰秒数),二分查找比线性快 - 示例片段(简化版):
auto pos = std::upper_bound(leaps.begin(), leaps.end(), tp.time_since_epoch(), [](const auto& s, const auto& p) { return s 其中 <code>tp</code> 是 <code>std::chrono::sys_time</code>,查到的前一项即生效闰秒条目
别踩坑:std::chrono::utc_clock 不等于“带闰秒的时钟”
虽然 C++20 声明了 std::chrono::utc_clock 类型别名,但它在所有主流标准库实现(libstdc++、libc++、MSVC STL)中都只是 std::chrono::system_clock 的别名 —— **不处理闰秒**。调用 utc_clock::now() 返回的仍是 Unix 时间,不是真正 UTC。
- 标准明确要求:
utc_clock的实现可选择“忽略闰秒”,当前全部实现都这么选 - 试图用
std::chrono::utc_time<:chrono::seconds></:chrono::seconds>构造对象不会触发闰秒修正 - 如果你依赖精确 UTC-TAI 对齐(如天文、高频金融),必须绕过标准库,用专业库如 date.h(它内置解析
leap-seconds.list)或绑定系统级服务(如 Linux 的adjtimex()+ NTP 状态)
闰秒不是“开个开关就能用”的功能,而是需要你主动管理数据源、验证时效性、并承担解析错误风险的一整套运维逻辑。标准 C++ 没替你做这件事,也不会做。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











