跳到主要內容

← 返回部落格

Unix 時間戳完整教學(秒、毫秒、時區怎麼換算)

只要處理過日誌、資料庫或 API,你一定看過像 1700000000 這種數字代表某個日期。那就是 Unix 時間戳,搞懂它能省掉一整類與時間有關的 bug。這篇給你完整全貌。

什麼是 Unix 時間戳?

Unix 時間戳是指從 Unix 紀元(1970 年 1 月 1 日 00:00:00 UTC)起算所經過的秒數。因為它從一個固定的 UTC 時間點起算,所以是一個在全世界都代表同一瞬間的絕對數字,與時區無關。

這個特性正是系統喜歡它的原因:兩台位於不同國家的伺服器可以直接比較時間戳,完全不用做時區換算。

秒 vs 毫秒

這是最常見的混淆來源。不同平台用不同單位:

  • —— 10 位數,例如 1700000000。常見於 Unix 工具、資料庫與許多 API。
  • 毫秒 —— 13 位數,例如 1700000000000。JavaScript 的 Date.now() 回傳這個。

一個口訣:10 位是秒、13 位是毫秒。如果換出來的日期落在 1970 年附近,你大概是把毫秒當秒(或反過來)傳了。我們的時間戳轉換工具會依位數自動判斷單位,不用你猜。

時區與 UTC

時間戳本身沒有時區 —— 它是一個絕對的瞬間。時區只在你顯示它時才有意義。同一個時間戳 1700000000 是:

  • UTC 的 2023-11-14 22:13:20
  • UTC+8(台北)的 2023-11-15 06:13:20

兩者是同一刻,只是以不同時區呈現。除錯時務必確認顯示的時間屬於哪個時區 —— 我們的工具會同時顯示你的本地時間與 UTC,避免出錯。

在程式中轉換

大多數語言的轉換都很直接:

// JavaScript(毫秒)
const now = Date.now();               // 1700000000000
const date = new Date(1700000000000); // Date 物件
const seconds = Math.floor(Date.now() / 1000);
# Python(秒)
import time
now = int(time.time())                # 1700000000
from datetime import datetime, timezone
dt = datetime.fromtimestamp(1700000000, tz=timezone.utc)

注意 JavaScript 用毫秒,而 Python 的 time.time() 回傳秒 —— 這又是一個要把單位分清楚的理由。

2038 年問題(簡述)

把時間戳存成有號 32 位元整數的系統,會在 2038 年 1 月 19 日溢位。現代系統改用 64 位元整數,把上限推到幾千億年後,所以今天很少需要擔心 —— 但值得知道為什麼要有 64 位元時間。

快速換算

想馬上檢查一個時間戳?把它貼進免費的 Unix 時間戳轉換工具,即可看到本地與 UTC 日期、把日期反轉成時間戳,或複製目前的時間戳。它在瀏覽器執行,不需連網。