裝置與系統問題

Unix Timestamp 的秒與毫秒:日期為什麼會變成 1970

把 Unix timestamp 轉成日期卻得到 1970 年附近,往往是把秒當成毫秒。如何分辨單位並正確轉換。

快速解答

如果 Unix timestamp 轉成日期落在 1970 年附近,多半是單位搞錯了。

Unix timestamp 通常用秒,JavaScript 的 Date 通常用毫秒。

現今日期裡,10 位數常常是秒,13 位數常常是毫秒。單位對不上時,可能需要乘以或除以 1000。

你把 timestamp 轉成日期,結果是 1970 年 1 月。很少是時鐘壞了。數字是用毫秒讀的,實際卻用秒存著——或相反。

什麼是 Unix timestamp?

Unix timestamp 表示從 Unix epoch(1970-01-01 00:00:00 UTC)起經過的時間。通常用整秒。同一瞬間也可以存成毫秒(秒 × 1000)。數字本身不標單位。

秒與毫秒:相差 1000 倍

1 秒等於 1000 毫秒。比較 1720000000 與 1720000000000。前者是秒、後者是毫秒時,它們是同一瞬間。把前者當毫秒讀,日期就會跳向 1970。

下列 UTC 結果由上面的數字算出,不是臆測。

數值 常見單位 含義(UTC)
1720000000 以秒解讀為近期日期:2024-07-03 09:46:40 UTC
1720000000000 毫秒 以毫秒解讀為同一瞬間:2024-07-03 09:46:40 UTC
把 1720000000 當毫秒 單位錯誤 接近 1970:1970-01-20 21:46:40 UTC

為什麼會顯示 1970?

把秒值當成毫秒處理,數字會小 1000 倍。JavaScript 只從 Unix epoch 起算了一小段,日期就停在 1970:

const seconds = 1720000000;

new Date(seconds);
// 1970-01-20 21:46:40 UTC

new Date(seconds * 1000);
// 2024-07-03 09:46:40 UTC

這個 1970 日期是 epoch 再加大約兩週。傳給 Date 之前,先把秒乘以 1000。

  • 秒 (SECONDS)
  • 1720000000
  • 毫秒 (MILLISECONDS)
  • 1720000000000
同一瞬間:秒 × 1000 = 毫秒。
  • 秒值
  • 被誤當成毫秒
  • 接近 1970 的日期
把秒當成毫秒讀,會落到 Unix epoch 附近。
是秒還是毫秒?

如果結果接近 1970,先查 timestamp 單位,再去查時區。

10 位數一定是秒、13 位數一定是毫秒嗎?

對現今日期,10 位數常常是秒,13 位數常常是毫秒。這是快捷線索,不是驗證規則。位數會隨時間範圍變化,有的 API 存微秒或奈秒。要用文件或說得通的日期來確認單位。

為什麼 JavaScript 裡特別常見

JavaScript 裡數字 Date 是 epoch 起的毫秒。很多後端、資料庫和 Unix 工具仍存秒。把秒直接傳給 Date 是常見錯誤:

const unixSeconds = 1720000000;

const wrong = new Date(unixSeconds);
const correct = new Date(unixSeconds * 1000);

wrong 落在 1970 附近(1970-01-20 21:46:40 UTC)。correct 才是目標的近期時刻(2024-07-03 09:46:40 UTC)。

其他系統可能用不同單位

其他語言、API 和資料庫可能用秒或毫秒。有的存微秒或奈秒。不要假定某種語言永遠只用一種單位——看文件。如果數字在 JSON 裡,JSON 格式化、驗證與比對 能讓欄位更好讀,但仍然不會告訴你單位。

怎麼判斷 timestamp 用的是哪種單位?

依這個順序檢查。只看位數不夠。

  1. 查 API 或資料庫文件。
  2. 看大概有多少位。
  3. 和合理的近期 timestamp 比大小。
  4. 分別按秒和按毫秒試一次。
  5. 看得到的日期是否說得通。

一種解讀是 1970,另一種是你認得的日期,原因就是單位不一致。

Unix timestamp 常見錯誤

  • 把秒當成毫秒。 日期會收成 1970,就像上面的例子。
  • 把毫秒當成秒。 日期跳到遙遠未來,或轉換失敗。
  • 乘以 1000 兩次。 本來已是毫秒的值會變得巨大,日期前進幾個世紀。
  • 除以 1000 兩次。 秒值再次縮小,又回到 1970 附近。
  • 怪時區。 時區可以改鐘點或日曆日。它不會把近期 timestamp 變成 1970。
  • 把格式化日期字串當成 Unix timestamp。 像 2024-07-03T09:46:40Z 這樣的值不是 epoch 數字。按日期字串解析,不要當秒。

時區會造成 1970 問題嗎?

通常不會。時區會改顯示的鐘點,接近午夜時也可能改日曆日期。它不會把現代 Unix timestamp 變成 1970。結果是 1970 時,先查秒和毫秒。

轉換並核對 Unix timestamp

NEXNARA 日期與時間轉換器 可在瀏覽器裡轉換 Unix timestamp。

可貼上 Unix 秒或毫秒、使用目前 timestamp、查看 UTC 與本地時間、轉換時區並格式化日期。自動偵測常常把 10 位當秒、13 位當毫秒;你仍可自己選單位。

轉換本身在瀏覽器中完成。本工具不會把日期或 timestamp 送到 NEXNARA 伺服器。廣告和其他網站功能仍會用網路;那與轉換無關。

要核對 Unix timestamp?打開 日期與時間轉換器,比較秒和毫秒。

FAQ

為什麼我的 Unix timestamp 顯示 1970?

常常是把秒當成毫秒讀了。JavaScript 會處理小得多的數字,日期就落在 1970-01-01 00:00:00 UTC 之後不久。把秒乘以 1000 再轉一次。

Unix timestamp 是秒還是毫秒?

通常是秒。很多 Web API 和 JavaScript Date 用毫秒。看該系統的文件。有的系統用微秒或奈秒。

秒怎麼轉成毫秒?

乘以 1000。1720000000 秒等於 1720000000000 毫秒。反過來就除以 1000。

為什麼 JavaScript Date 用毫秒?

JavaScript 的數字 Date timestamp 定義為自 Unix epoch 起的毫秒。所以當 unixSeconds 是 Unix 秒時,new Date(unixSeconds) 是錯的。

10 位 timestamp 一定是秒嗎?

不是。對現今日期常常是,13 位常常是毫秒。位數是線索,不是規則。用文件或說得通的日期確認。

Unix timestamp 裡有時區嗎?

沒有。Unix timestamp 是從 1970-01-01 00:00:00 UTC 起算的一個瞬間。時區只影響怎麼顯示,不影響這個數字本身。