讲师中心 微信公众号
AI工具推荐 视频效率加速

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

老墨大大_5783

老墨大大_5783

发布时间:2026-03-20 20:30:00

|

789人浏览过

|

来源于php中文网

原创

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> 扩展被 C++20 采纳部分接口,但闰秒支持仍需手动集成)。

关键步骤:

立即学习“C++免费学习笔记(深入)”;

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<date::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++

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

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

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

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

1953

2023.08.11

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

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

2834

2023.10.07

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

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

3088

2023.10.19

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

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

4569

2025.10.17

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

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

3729

2025.12.29

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

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

426

2026.01.19

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

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

2505

2023.06.29

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

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

3781

2023.08.14

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn