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 年或非常遙遠的日期,代表單位讀錯了。