epoch 毫秒轉日期:轉換 13 位時間戳和 long 值

把 epoch 毫秒轉換為可讀日期的指南。涵蓋 13 位時間戳、JavaScript Date、Java long 值、毫秒與秒,以及為什麼錯誤的單位會產生 1970 年或很遙遠的日期。

什麼是 epoch 毫秒

epoch 毫秒計數自 1970 年 1 月 1 日 00:00:00 UTC 起的毫秒。它使用與 Unix 秒相同的 Unix 紀元,但精度多三位。現代的 epoch 毫秒值通常為 13 位,如 1700000000000。

如何把 millis 轉為日期

如果值已經是毫秒,JavaScript Date 可以直接讀取。如果接收工具期望秒,請先除以 1000。主要錯誤是在錯誤的邊界上做乘除。

  • JavaScript: new Date(1700000000000).toISOString()
  • Milliseconds to seconds: Math.floor(1700000000000 / 1000)
  • Seconds to milliseconds: 1700000000 * 1000
  • Java Instant: Instant.ofEpochMilli(1700000000000L)
  • Python: datetime.fromtimestamp(ms / 1000, tz=timezone.utc)

在 Java 與資料庫中把 long 轉為日期

搜尋「long 轉日期」通常來自 Java、Kotlin、Android,或把時間戳存為 64 位整數的資料庫匯出。該值可能是 epoch 毫秒,但也可能是秒、微秒或奈秒。轉換前請檢查位數。

  • 10 位:很可能是 Unix 秒
  • 13 位:很可能是 Unix 毫秒或 Java long 毫秒
  • 16 位:很可能是微秒
  • 19 位:很可能是奈秒
  • 始終用單位命名欄位,例如 created_at_ms

為什麼毫秒會轉換成奇怪的日期

把毫秒值當作秒會得到極其遙遠的未來日期。把秒值當作毫秒會得到接近 1970 年 1 月的日期。位數是最快的診斷方式。

  • 1700000000000 作為毫秒 = 2023-11-14 22:13:20 UTC
  • 1700000000000 作為秒 = 約西元 55840 年,視函式庫而定
  • 1700000000 作為秒 = 2023-11-14 22:13:20 UTC
  • 1700000000 作為毫秒 = 1970-01-20 16:13:20 UTC

epoch 毫秒常見問題

ms 的 epoch 時間和 Unix 時間戳一樣嗎?
使用相同的紀元,但單位是毫秒而非秒。經典的 Unix 時間戳通常指秒。
epoch 毫秒時間戳有幾位?
對目前日期,epoch 毫秒通常為 13 位。
JavaScript 用毫秒還是秒?
JavaScript Date 用毫秒。Date.now() 回傳 epoch 毫秒。
如何把 Java long 時間戳轉為日期?
若 long 是 epoch 毫秒,用 Instant.ofEpochMilli(value);若是 epoch 秒,用 Instant.ofEpochSecond(value)。先檢查位數:13 位通常是毫秒,10 位通常是秒。