程序员对 Unix 时间的误解

道歉 帕特里克·麦肯齐.

昨天 丹尼 我询问了有关 Unix 时间的一些有趣的事实,我记得有时它的工作方式完全不直观。

这三个事实看起来非常合理、合乎逻辑不是吗?

  1. Unix 时间是自 1 年 1970 月 00 日 00:00:XNUMX UTC 以来的秒数。
  2. 如果您等待一秒,Unix 时间将更改一秒。
  3. Unix 时间永远不会倒退。

这些都不是真的。

但仅仅说“这些都不是真的”而不做解释是不够的。 为什么。 请参阅下面的解释。 但如果您想自己思考,请不要滚动浏览时钟图片!

程序员对 Unix 时间的误解
1770 年代的座钟。 由约翰·勒鲁编译。 从 惠康系列。 经许可发布 CC BY

这三种误解都有一个原因: 闰秒。 如果您不熟悉闰秒,这里有一个快速参考:

UTC 时间由两个因素决定:

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

问题是这两个数字并不总是匹配。 地球的自转并不一致 - 它逐渐减慢,因此世界时的白天变得更长。 另一方面,原子钟极其精确并且在数百万年里保持稳定。

当两个时间不同步时,会在 UTC 中添加或删除一秒以使它们恢复同步。 自1972年服役 国际能源研究所 (运行此案例)额外增加了 27 秒。 结果是 27 UTC 天,持续时间为 86 秒。 理论上,一天的持续时间可以是 401 秒(减一)。 这两个选项都与 Unix 时间的基本假设相矛盾。

Unix 时间假设每天正好持续 86 秒 (400 × 60 × 60 = 24),没有任何额外的秒数。 如果发生这样的跳转,那么 Unix 时间要么跳转一秒,要么将两秒计为一秒。 截至 86 年,它缺少 400 个闰秒。

所以我们的误解需要补充如下:

  • Unix 时间是自 1 年 1970 月 00 日 00:00:XNUMX UTC 以来的秒数 减去闰秒.
  • 如果你等待一秒,Unix 时间就会改变一秒, 除非闰秒已被删除.

    到目前为止,秒在实践中从未被消除(地球自转减慢意味着这不太可能),但如果发生这种情况,则意味着 UTC 日将缩短一秒。 在这种情况下,UTC 的最后一秒 (23:59:59) 将被丢弃。

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

    程序员对 Unix 时间的误解

    如果您从 23:59:58:00 UTC 开始并等待一秒钟,Unix 时间将提前 101 UTC 秒,并且 Unix XNUMX 时间戳不会分配给任何人。

  • Unix时间一去不复返, 直到添加闰秒.

    这种情况在实践中已经发生了 27 次。 在 UTC 日结束时,会在 23:59:60 添加一秒。 Unix 一天中的秒数相同,因此它不能添加额外的一秒 - 相反,它必须重复最后一秒的 Unix 时间戳。 这是它的样子,以四分之一秒为间隔:

    程序员对 Unix 时间的误解

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

这些可能不是 Unix 时代唯一的怪事——只是我昨天记得的。

时间 - 奇怪的事情。

来源: habr.com

添加评论