c++的std::chrono库如何处理闰秒? (UTC vs TAI)
技术百科
尼克
发布时间:2026-01-21
浏览: 次 std::chrono不处理闰秒,所有标准时钟均忽略闰秒,依赖外部库(如date)或手动查表实现UTC/TAI转换。
std::chrono 不处理闰秒,它基于系统时钟(通常是 UTC),但完全不感知闰秒存在。
std::chrono 的时钟类型都不支持闰秒
所有标准时钟 —— std::chrono::system_clock、std::chrono::steady_clock、std::chrono::high_resolution_clock —— 都是单调或近似 UTC 的实现,但 C++ 标准明确回避了闰秒语义:
-
system_clock通常映射到 POSIXclock_gettime(CLOCK_REALTIME, ...)或 WindowsGetSystemTimeAsFileTime(),二者都跳过闰秒(即“smear”或直接忽略) - 没有
std::chrono::tai_clock或std::chrono::utc_clock(C++20 及之前标准) - 即使系统底层使用 TAI(如某些 NTP 服务器),
system_clock::time_point仍按“Unix 时间戳”解释
:自 1970-01-01T00:00:00 UTC 起的秒数(不含闰秒)
闰秒发生时 std::chrono 的实际行为
以 2016 年末的闰秒(UTC 23:59:60)为例:
- Linux 系统通常采用“重复秒”策略:
23:59:60→23:59:60→00:00:00,但clock_gettime(CLOCK_REALTIME)多数发行版会“抹平”(smear),让这一秒被拉长或跳过 -
system_clock::to_time_t()和system_clock::from_time_t()无法表示23:59:60—— 它们只接受struct tm中tm_sec ∈ [0, 60),而60是 POSIX 允许的闰秒值,但std::chrono的转换函数不校验或处理该值 - 若你用
std::put_time格式化一个恰好落在闰秒窗口内的time_t,结果取决于 libc 实现(glibc 支持tm_sec == 60,但std::chrono不保证传入合法值)
需要 TAI/UTC 对齐时怎么办?
标准库无解,必须依赖外部数据和手动校正:
- 闰秒表是离散、人工发布的(如 IERS Bulletin C),需定期更新本地数据库(如
leap-seconds.list) - 可用第三方库辅助:
–
date库(Howard Hinnant)提供date和utc_clock,并内置截至编译时的闰秒表 – 示例:将 TAI 时间转为带闰秒的 UTC 字符串需显式调用tai_clock(内部查表) - 自行实现需注意: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()。
# ai
# 都是
# windows
# 跳过
# 都不
# 第三方
# 为例
# 而非
# 若你
# win
# linux
# c++
# 标准库
# 字符串
# 数据库
# Struct
# 落在
# unix
# date
# 不含
# 年末
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何提升Golang程序I/O性能_Golang
- 如何解决同一段404代码在不同主机上表现不一致的问
- 如何使用Golang配置安全开发环境_防止敏感信息
- php485函数执行慢怎么优化_php485性能提
- 如何在 ACF 中正确更新嵌套多层的 Group
- php本地部署后session无法保存_sessi
- Win10如何更改用户账户控制_Windows10
- php怎么连接数据库_MySQL数据库连接的基础代
- Mac如何与安卓手机传文件_Mac和Android
- Python对象比较与排序_集合使用说明【指导】
- 如何在 Go 中判断变量是否为函数类型
- 获取 PHP 文件最后修改时间的正确方法
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- 如何在Golang中验证模块完整性_Golangg
- 如何在Golang中捕获结构体方法错误_Golan
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Linux怎么实现内网穿透_Linux安装Frp客
- php打包exe后无法读取环境变量_变量配置方法【
- 如何使用Golang进行HTTP服务性能测试_测量
- Win11声音忽大忽小怎么办 Win11音频增强功
- Python脚本参数接收_sys与argparse
- Win10怎样设置多显示器_Win10多显示器扩展
- Win11如何设置开机问候语 Win11修改登录界
- c++的STL算法库find怎么用 在容器中查找指
- PHP的Workerman对架构扩展有啥帮助_应用
- mac怎么打开终端_MAC终端Terminal使用
- Win11怎么更改账户头像_Windows 11自
- 如何高效识别并拦截拼接式恶意域名 spam
- 如何使用Golang实现微服务事件驱动_使用消息总
- Win11怎么设置闹钟_Windows 11时钟应
- Win11怎么调整屏幕亮度_Windows 11调
- Win11怎么更改电脑密码_Windows 11修
- Win11怎么设置任务栏透明_Windows11使
- Windows 10怎么隐藏特定更新补丁_Wind
- Win11 C盘满了怎么清理 Win11磁盘清理和
- windows如何测试网速_windows系统网络
- c++的mutex和lock_guard如何使用
- 如何在Golang中使用内置函数_Golangle
- Windows10系统怎么查看防火墙状态_Win1
- MAC如何启用访达侧边栏显示_MAC Finder
- Linux如何使用grep搜索文件内容_Linux
- Win11怎么更改任务栏位置_修改注册表将Win1
- Win11怎么关闭小组件_Win11禁用任务栏天气
- 如何诊断并终止卡死的 multiprocessin
- Win11更新后变慢怎么办_Win11系统更新后卡
- Python解释执行模型_字节码流程说明【指导】
- Win10电脑怎么设置IP地址_Windows10
- 如何在Mac上搭建Golang开发环境_使用Hom
- 如何在Golang中修改数组元素_通过指针实现原地
- Bpmn 2.0的XML文件怎么画流程图


QQ客服