tai_clock 不是 C++20 或任何现行标准的一部分;它仅出现在已废弃的提案草稿中,未被标准化,编译器会报错,实际使用需依赖外部库或手动换算 TAI-UTC 偏移。

std::chrono::tai_clock 在 C++ 标准中根本不存在
直接说结论:tai_clock 不是 C++20 或任何现行标准(C++11/14/17/20/23)的一部分。你查不到它的声明,链接会失败,编译器会报 error: 'tai_clock' is not a member of 'std::chrono'。这不是你配置错了,也不是头文件没包含全——它压根就没被标准化。
为什么网上有人提到 std::chrono::tai_clock?
它出现在早期 ISO/IEC JTC1 SC22 WG21(C++ 标准委员会)的某些提案草稿(如 P0355R3)中,作为“日历支持”扩展的一部分,目标是提供基于国际原子时(TAI)的时钟。但该提案最终被大幅拆分、延迟,且 tai_clock 被移除。目前(截至 C++23),标准仅定义了 system_clock、steady_clock 和 high_resolution_clock(后者为别名,不保证高精度)。
想用 TAI 时间,实际能做什么?
如果你真需要 TAI 时间(比如卫星导航、天文观测、高精度时间同步),必须自行实现或依赖外部库:
-
tai_clock无法直接使用,不要在代码里写std::chrono::tai_clock::now() - 可基于
system_clock+ 已知 TAI-UTC 偏移量(如当前为 +37 秒,2024 年起生效)手动换算,但需注意闰秒发生时偏移量会变,必须定期更新数据源 - 推荐用成熟第三方库,例如
Howard Hinnant's date library(已集成进 C++20<chrono>的日历部分,但依然不包括 TAI);更现实的选择是libtai(C 库)或SOFA(IAU 提供的天文计算库) - 若只是要“高精度时间戳”,优先用
std::chrono::high_resolution_clock::now(),再确认你的平台是否真返回纳秒级(Linuxclock_gettime(CLOCK_MONOTONIC)通常可以,WindowsQueryPerformanceCounter也够用)
容易踩的坑:把 high_resolution_clock 当作 TAI 或 UTC
high_resolution_clock 是实现定义的——它可能是 steady_clock,也可能是 system_clock,甚至两者都不是。它只保证“高分辨率”,不保证纪元、偏移或闰秒处理:
立即学习“C++免费学习笔记(深入)”;
- 它不等于 TAI,也不等于 UTC,更不自动跟踪闰秒
- 跨平台时,
high_resolution_clock::time_since_epoch()的起点可能不同(如 Windows 是系统启动时间) - 做长时间差计算(>1 小时)时,若误以为它是 UTC,叠加 NTP 校正后可能引入毫秒级偏差
- 真正需要 TAI 的场景,必须明确区分“测量间隔”(用
steady_clock)和“绝对时刻”(需外部授时源 + TAI 转换逻辑)
TAI 绝对时间不是靠改几个模板参数就能拿到的,它依赖外部权威时间源和持续维护的闰秒表。别指望标准库替你管这个。


















