Unix 時間戳格式詳解

所有 Unix 時間戳格式的完整參考 —— 秒、毫秒、微秒、ISO 8601 和 RFC 2822 —— 並附範例說明每種語言和資料庫使用哪種格式。

秒級 Unix 時間 — 通用格式

最常見的格式:計數自 1970 年 1 月 1 日 00:00:00 UTC 以來整秒數的 32 位或 64 位整數。目前約 17 億的 10 位數字。

  • 範例:1700000000 = 2023-11-15 06:13:20 UTC
  • 使用者:Python time.time()、PHP time()、Go time.Now().Unix()、Ruby Time.now.to_i、C time(NULL)
  • 儲存為:32 位 int(舊有,最大到 2038 年),64 位 int(現代,可安全數十億年)
  • 資料庫:MySQL UNIX_TIMESTAMP()、PostgreSQL EXTRACT(EPOCH FROM NOW())::BIGINT

毫秒級 Unix 時間 — JavaScript 的格式

自 Unix 紀元以來的毫秒:具備毫秒精度的 13 位整數。這是 JavaScript Date 物件內部使用的格式。

  • 範例:1700000000000 = 2023-11-15 06:13:20.000 UTC
  • 使用者:JavaScript Date.now()、Java System.currentTimeMillis()、.NET DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  • 轉換為秒:Math.floor(ms / 1000)
  • 從秒轉換:seconds * 1000

ISO 8601 — 人類可讀的標準

ISO 8601 是以字串表示日期與時間的國際標準。與 Unix 時間戳不同,它是自描述的:格式中同時編碼了日期/時間與時區偏移。

  • 2023-11-15T06:13:20Z — UTC(後綴 Z 表示 UTC)
  • 2023-11-15T01:13:20-05:00 — 帶顯式 UTC 偏移(EST)
  • 2023-11-15T06:13:20.000Z — 帶毫秒
  • JavaScript:date.toISOString() 始終回傳帶 Z 後綴的 UTC
  • Python:datetime.isoformat(),Go:time.Format(time.RFC3339)

RFC 2822 — 郵件與 HTTP 日期格式

RFC 2822(用於 HTTP 時也稱 RFC 1123)是郵件標頭與 HTTP 回應中使用的日期格式。JavaScript 的 Date.toUTCString() 回傳此格式。

  • 範例:Wed, 15 Nov 2023 06:13:20 GMT
  • 用於:HTTP 回應標頭(Last-Modified、Date、Expires)、郵件標頭(Date:)
  • JavaScript:date.toUTCString()
  • 在現代 API 中較少見,但在 Web 基礎設施中仍廣泛存在

如何辨識時間戳格式

當你收到未知的時間戳值時,用以下規則辨識其格式:

  • 10 位、以 1 開頭 → Unix 秒(如 1700000000)
  • 13 位、以 1 開頭 → Unix 毫秒(如 1700000000000)
  • 負數 → 1970 年之前的 Unix 秒或毫秒
  • 含 T 或 Z → ISO 8601(如 2023-11-15T06:13:20Z)
  • 含逗號或星期名 → RFC 2822(如 Wed, 15 Nov 2023 ...)
  • 16 位 → 微秒(除以 1,000,000 得到秒)
  • 19 位 → 奈秒(除以 1,000,000,000 得到秒)

微秒與奈秒

一些高精度系統使用比毫秒更小的單位。它們在應用層程式碼中罕見,但出現在底層系統、資料庫內部與可觀測性工具中。

  • 微秒(µs):16 位整數 — Rust SystemTime as_micros()、PostgreSQL clock_gettime()
  • 奈秒(ns):19 位整數 — Go time.Now().UnixNano()、Rust SystemTime as_nanos()
  • PostgreSQL EXTRACT(EPOCH) 回傳一個以微秒作為小數部分的浮點數
  • 將奈秒轉換為秒:除以 1,000,000,000(1e9)

Unix 時間戳格式常見問題

Unix 時間戳有幾位?
現代 Unix 時間戳以秒計為 10 位(約 17 億),以毫秒計為 13 位。微秒為 16 位,奈秒為 19 位。
Unix 時間與 ISO 8601 有何區別?
Unix 時間是自 1970 UTC 以來的秒或毫秒的單個數字,不含時區。ISO 8601 是像 2023-11-15T06:13:20Z 這樣的自描述字串,編碼了日期、時間與偏移。
如何判斷時間戳是秒還是毫秒?
數位數:10 位是秒,13 位是毫秒。若某個值轉換出接近 1970 年或非常遙遠的日期,代表單位讀錯了。