Boring Game

Unix time 與 2038 年問題

(本篇為 BlogBlog 同樂會 - 第 7 期:有趣的小知識或冷門概念之投稿貼文)

Unix time 是什麼?

Unix time 是從西元 1970 年 1 月 1 日 0 時 0 分 0 秒(UTC)至今所經過的秒數(不包含閏秒1),運用於資料庫、logs、檔案的 timestamp 等處。

這是現在的 Unix time3,在 Javascript 中可以用 Date.now() 除以 1000 並向下取整得出。

2038 年問題

  1. 現在有許多裝置仍以 32 位元有號整數4表示 Unix time。
  1. 西元 1970 年 1 月 1 日 0 時 0 分 0 秒的 2147483648(231)秒後,這些 Unix time 會 overflow,導致對應 UTC 時間變成西元 1901 年 12 月 13 日 20 時 45 分 52 秒。
  2. 任何仍以 32 位元有號整數儲存 Unix time 的任何程式與系統可能出現問題。
  3. 意即類似 Y2K 的危機將於 西元 2038 年 1 月 19 日 3 時 14 分 8 秒再度重演。關於其更詳細的介紹,可以看啾啾鞋的這部影片:

解決方法

免責聲明(?)

如果上文內容有誤或是用字不夠精確,請使用 e-mail 聯繫我,或是進入我的 Discord 伺服器幫助我。


  1. 因此出現正閏秒2(插入閏秒)時,同一個 Unix time 將對上兩個 UTC 時間點。 ↩︎

  2. 這邊只提到正閏秒是因為目前還沒出現過負閏秒。至於未來可能出現的時間點,可以看看這篇論文。 ↩︎

  3. 其實該數字仍不夠準確,至於原因,你可以 F12 看看源代碼。(也可以在終端機輸入 date +%s 顯示準確的 Unix time) ↩︎

  4. 由於需要表示西元 1970 年 1 月 1 日 0 時 0 分 0 秒(UTC)前的時間,很多系統會將數字的最高位(二進位)當作正負號,0 為正、1 為負。 ↩︎

<< Previous Post

|

Next Post >>

#Boring Game #BlogBlog 同樂會 #Blog