关于闰秒

文章背景

前两天写了关于timestamp与日期互转的文章, 分享给同事的时候, 同事问是否支持闰秒, 最后引发出一个关于闰秒的讨论!

什么是闰秒

闰秒是在协调世界时(UTC)中增加或减少一秒,使它与平太阳时贴近所做调整。UTC,是透过广播作为民用时的官方时间基础,它使用非常精确的原子钟来维护。要保持UTC与平太阳时的一致性,偶尔需要调整,也就是"跳个"1秒来做调整,就是所谓添加闰秒(请参阅ΔT)。闰秒时间现在是由国际地球自转和参考座标系统服务(IERS)来确认,而在1988年1月1日之前是由国际时间局(BIH)承担这项职责。

计算机时间

计算机时间又称timestamp, 计算机度量时间的标准与现实时间是吻合的, 现实时间过了100秒, 那么计算机时间一定也是过了100秒.

闰秒与计算机的冲突

闰秒某种程度上是人为增加一秒, 但是计算机并不知道我们增加了一秒, 导致现实时间与计算机时间不一致. 大致是这样, 如果现在是23:59秒, 下一秒的时候, 按理来说就是明天00:00时了, 可是我们人为规定, 要下一秒的下一秒才是00:00. 于是在我们的00:00的时候, 计算机已经是00:01了.

处理闰秒

为了让计算机的时间与我们的时间一致, 那么我们就得告诉计算机, 下一秒的时候是闰秒, 你得处理一下, 然后在下一秒的下一秒的时候再变成00:00.

对这个问题的处理具体要看 Red Hat Enterprise Linux 系统运行的是 NTP(网络时间协议)还是 PTP(精确时间协议)守护进程。

运行 NTP 的系统

运行 Red Hat Enterprise Linux 任何版本的系统,如果使用 NTP(网络时间协议)守护进程将其本地计时与 NTP 服务器同步,则都应自动进行闰秒调整。进行闰秒调整的前一天,NTP 服务器应通知其客户端第二天的 23:59:59 UTC 会发生发生闰秒,Linux 内核应通过两次显示第 60 秒或彻底删除它,以便添加或者删除额外一秒。因此,在闰秒调整期间,运行 NTP 的 Red Hat Enterprise Linux 系统应有如下计时显示:

2008-12-31 23:59:59 UTC
2008-12-31 23:59:59 UTC
2009-01-01 00:00:00 UTC

运行 PTP 的系统

PTP 中交换的时间戳通常采用不包含闰秒的 TAI(国际原子时);但 ptp4l 和 phc2sys 将设置内核标签,插入闰秒以便系统时钟继续以 UTC 运行。然后该内核就可以正常插入闰秒。

产生的问题

一旦出现闰秒, 会产生两个相同的timestamp, 如果用这个timestamp转时间, 那么只能转出非闰秒的时间.

localtime, timestamp与闰秒

timestamp是闰秒透明的, 也就是说闰秒在这个时间轴上不存在.

平常我们用localtime与timestamp互转, 在闰秒的时候localtime转出的timestamp是上一秒的时间, 但是表示时间的struct tm是可以表示闰秒的.

如果现在是闰秒, 我们用tm打印时间, 我们会发现tm.tm_sec == 60.

参考资料

欢迎大家订阅雀观代码, 我将给你讲述, 中小企业程序员, 淘金路上的故事.



发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注