程序员对Unix时间的误解

我向Patrick Mackenzie表示歉意。

丹尼(Danny)昨天询问了有关Unix时间的奇怪事实,我回想起有时候它完全不直观。

这三个事实似乎是非常合理和合乎逻辑的,对吗?

  1. Unix时间是自1970年1月1日UTC 00:00:00以来的秒数。
  2. 如果您恰好等待一秒钟,那么Unix时间将恰好改变一秒钟。
  3. Unix时间永远不会退后。

所有这些都不是真的。

但是仅说“所有这一切都是不真实的”而没有解释原因是不够的。 请参阅下面的说明。 但是,如果您想自己想一想,请不要滚动时钟!


1770年代的座钟。 由John Leroux编译。 来自Wellcome收藏 根据CC BY发布

所有这三个谬论都有一个原因: leap秒 。 如果您不熟悉额外的秒数,请参考以下快速参考:

UTC时间由两个因素决定:

  • 国际原子时间 :全球数百个原子钟的平均读数。 我们可以通过原子的电磁特性来测量秒,这是科学上已知的最精确的时间测量。
  • 世界时间 ,基于地球绕其自身轴的自转。 一整圈-一天。

问题在于这两个数字并不总是重合。 地球自转不一致-它在逐渐变慢,因此世界时的一天越来越长。 另一方面,原子钟的精确度和魔力在数百万年以来都是不可思议的。

当两次不同步时,会在UTC中添加或删除第二次以恢复同步。 自1972年以来, IERS服务(运行此案例)已增加了27秒。 结果是27天的UTC持续86,401秒。 从理论上讲,一天的持续时间为86 399秒(减一)是可能的。 两种选择都与Unix时间的基本假设背道而驰。

Unix时间假设每天精确地持续86,400秒(60×60×24 = 86,400),而没有任何额外的秒。 如果发生了这种飞跃,则Unix时间要么在一秒后跳跃,要么一秒计数两秒。 截至2019年,它缺少27 leap秒。

因此,我们的错误必须补充如下:

  • Unix时间是自1970年1月1日00:00:00 UTC以来的秒数减去leap秒
  • 如果您恰好等待一秒钟,则如果未删除多余的秒数,则Unix时间将恰好更改为一秒

    到目前为止,实际上,秒数从未消除过(地球自转速度减慢意味着这不太可能发生),但是,如果发生这种情况,则意味着UTC时间要短一秒。 在这种情况下,UTC的最后一秒(23:59:59)被丢弃。

    每个Unix天都有相同的秒数,因此缩短的一天中的最后Unix秒将不对应任何UTC时间。 这是每四分之一秒间隔的样子:



    如果您在世界标准时间23:59:58:00开始并等待一秒钟,则Unix时间将提前两秒UTC,并且Unix 101时间戳不会分配给任何人。
  • Unix时间永远无法倒退, 除非再增加一秒钟

    实际上,这已经发生了27次。 在一天结束时,UTC会再添加23:59:60。 Unix天数具有相同的秒数,因此它不能增加额外的一秒-相反,您必须在最后一秒重复Unix时间戳。 这是每四分之一秒间隔的样子:



    如果您从23:59:60.50开始并等待半秒钟,则Unix时间返回半秒,而Unix 101时间戳对应于两秒UTC。

这些可能不是Unix时间的唯一怪胎-只是我昨天记得的东西。

时间是一件奇怪的事情。

Source: https://habr.com/ru/post/zh-CN452584/


All Articles