只要處理過日誌、資料庫或 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 日期、把日期反轉成時間戳,或複製目前的時間戳。它在瀏覽器執行,不需連網。