程式設計師對 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 時代唯一的怪事——只是我昨天記得的。

時間 - 奇怪的事情。

來源: www.habr.com

添加評論