c++ c++20日历库用法 c++如何处理leap second闰秒

老墨大大_5783

老墨大大_5783

2026-03-20

789人浏览

原创

std::chrono 不能直接处理闰秒。它将 utc 视为线性时间轴,使用固定偏移(tai−37s),不集成闰秒表,也不响应 iers 公告;需借助 howard hinnant 的 date 库等外部方案手动加载和解析 leap-seconds.list 才能实现真实 utc 对齐。

c++ c++20日历库用法 c++如何处理leap second闰秒

std::chrono 能不能直接处理闰秒

不能。C++20 的 std::chrono(包括 sys_time、utc_time、tai_time)**不包含闰秒表,也不自动插入或跳过闰秒**。它把 UTC 当作“平滑连续的线性时间轴”来建模,和 IERS 实际发布的闰秒公告脱钩。

这意味着:如果你用 std::chrono::utc_clock::now() 获取当前 UTC 时间,返回值是基于 C++ 标准定义的“理想化 UTC”(即 TAI − 37s,固定偏移),不是真实世界中可能因闰秒而暂停/跳变的广播 UTC。

  • 真实 UTC 在 2016-12-31 23:59:60 插入一秒 → 你的程序不会感知这个额外的 “60” 秒
  • utc_clock::from_sys(…) 和 utc_clock::to_sys(…) 的转换只依赖编译时硬编码的闰秒数(C++20 初始为 37),不会查系统时区数据库或网络公告
  • 所有标准库时间点运算(加减、比较)都按“无闰秒”假设进行,结果在高精度授时场景下会漂移

想对齐真实 UTC,得自己加载闰秒表

必须显式引入外部闰秒数据源,并重写时间转换逻辑。主流做法是用 Howard Hinnant 的 date 库(已作为 <chrono></chrono> 扩展被 C++20 采纳部分接口,但闰秒支持仍需手动集成)。

关键步骤:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 下载并解析 IERS 官方 leap-seconds.list(路径如 /usr/share/zoneinfo/leap-seconds.list 或从 ietf.org 获取)
  • 用 date::parse("%Y-%m-%d %H:%M:%S", …) 解析闰秒生效时间(注意:IERS 给的是 TAI 时间戳)
  • 构建 std::vector<:sys_seconds></:sys_seconds> 记录每个闰秒插入点(转成系统时间)
  • 封装自己的 real_utc_clock,在 now() 中查表修正

示例片段(需 date 库):

auto ls = date::get_leap_second_info(); // 需提前 load_leap_seconds()
auto tai = date::tai_clock::now();
auto utc = date::utc_clock::from_tai(tai); // 仍用标准转换
// 但若要映射到广播 UTC,则需:if (tai >= ls.last_tai) utc += 1s;

Linux 系统级闰秒处理其实也不可靠

别指望 clock_gettime(CLOCK_REALTIME, ...) 或 gettimeofday() 自动处理闰秒——Linux 默认采用“ smear ”(涂抹)策略(如 NTPd 的 -x 模式),把闰秒差值摊到数小时均匀调整;或者直接忽略(多数容器/云环境默认)。

  • CLOCK_TAI 是唯一保证线性的时钟,但它返回的是 TAI,不是广播 UTC
  • /proc/sys/kernel/time/ntp_tick_shift 等参数只影响内核 tick,不改变用户态时间 API 行为
  • systemd-timesyncd、chrony 等工具是否启用闰秒支持,取决于配置(如 chrony 的 leapsectz 指令),且需要定期更新 leapseconds 文件

业务代码里要不要主动处理闰秒

绝大多数应用不需要。日志打点、定时任务、HTTP 请求超时、数据库事务时间戳——这些都不依赖秒级精度对齐 IERS UTC。

  • 金融交易系统:通常用 TAI 或自增序列号做事件排序,UTC 仅作可读标注
  • 分布式追踪:依赖 std::chrono::steady_clock(单调、无闰秒)做 span duration
  • 只有卫星导航、射电天文、原子钟同步等场景才真需要闰秒对齐
  • 如果真要支持,别自己解析 leap-seconds.list —— 用成熟封装如 libfixposix 或 abseil 的 TimeZone::Lookup(带闰秒上下文)

最常被忽略的一点:闰秒发生时刻,strftime("%H:%M:%S", ...) 可能输出 "23:59:60",但你的 struct tm 解析器大概率没实现这个扩展,会崩或回绕。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1953

5

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.07

2814

5

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3088

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4549

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3729

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

406

15

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2485

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3761

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2711

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习