什麼是 Unix 時間戳?完整指南
什麼是 Unix 時間戳?
Unix 時間戳(也稱為 POSIX 時間或紀元時間)是一種追蹤時間的系統,計算從 Unix 紀元——1970 年 1 月 1 日 00:00:00 UTC——起經過的秒數,不包含閏秒。
與因時區而異的人類可讀日期("2026 年 7 月 19 日下午 3:30 EST")不同,Unix 時間戳是一個單一整數,在地球上任何地方都代表相同的時刻。例如,時間戳 1785292800 對應於一個特定的瞬間,無論您是在紐約、倫敦還是東京。
Unix 時間戳是現代計算中時間處理的基礎。作業系統、程式語言、資料庫和檔案系統在底層都依賴這個簡單的整數表示法。
Unix 紀元:為什麼是 1970 年 1 月 1 日?
選擇 1970 年 1 月 1 日作為「紀元」(起始點)並非任意決定。以下幾個實際考量導致了這個選擇:
- 早期 Unix 開發:Unix 作業系統於 1960 年代末至 1970 年代初在貝爾實驗室開發。到 1970 年代初期時間系統被標準化時,1970 年 1 月 1 日是一個乾淨且近期的參考點。
- 簡潔性:早期 Unix 系統上的時間以 32 位元帶符號整數計算秒數儲存。使用近期的日期可最大化未來的可表示範圍。
- 先例:該紀元在第一個 POSIX 標準中被正式確立,使其成為所有 Unix 衍生系統的通用參考。
早期的類 Unix 系統曾使用不同的紀元日期,但 1970 年紀元最終勝出,並從此成為所有 POSIX 相容系統的標準。
時間戳值的運作方式
核心概念很直觀:
- 時間戳
0表示1970 年 1 月 1 日 00:00:00 UTC - 時間戳
86400(60 × 60 × 24)表示1970 年 1 月 2 日 00:00:00 UTC - 時間戳
-3600表示1969 年 12 月 31 日 23:00:00 UTC(負數時間戳表示紀元之前的日期)
公式很簡單:
時間戳 = 自 1970-01-01 00:00:00 UTC 以來的秒數
毫秒級時間戳
許多現代系統,特別是 JavaScript 和 Web API,使用毫秒而非秒。毫秒級時間戳只是將秒級的值乘以 1000:
- JavaScript
Date.now()回傳毫秒 - Python
time.time()以包含毫秒小數的浮點數回傳秒
在轉換之前務必確認系統使用的精度,因為混用可能會產生偏差數十年的日期。
2038 年問題
2038 年問題(也稱為「Unix 千禧蟲」或「Y2K38」)是一個時間表示問題,將影響以32 位元帶符號整數儲存時間戳的系統。
32 位元帶符號整數可容納約 -21 億到 +21 億之間的值。可表示的最大 Unix 時間戳是 2147483647,對應於:
- 2038 年 1 月 19 日 03:14:07 UTC
一秒後,該值將溢位為 -2147483648,代表1901 年 12 月 13 日——導致系統將當前時間解釋為 20 世紀初的日期。
哪些系統會受影響?
- 使用 32 位元處理器的嵌入式設備和 IoT 硬體
- 較舊的嵌入式 Linux 核心
- 使用 32 位元整數時間欄位的舊版資料庫
- 以 32 位元整數儲存時間的檔案系統和二進位格式
解決方案
現代系統大多已轉向使用64 位元整數進行時間儲存。64 位元帶符號整數可表示未來約 2920 億年的時間——對任何實際用途而言幾乎是無限的。
- 大多數 64 位元硬體上的現代 Linux 發行版已經安全
- Linux 核心在 64 位元系統上使用 64 位元 time_t 已有多年
- 核心 5.6+ 為 32 位元架構引入了 64 位元 time_t 支援
- Python、Go 和 Java 等程式語言內部使用 64 位元整數
如果您維護嵌入式系統或舊版軟體,現在檢查 time_t 的大小是值得做的事。
UTC 及其與 Unix 時間戳的關係
Unix 時間戳本質上是時區無關的——它們始終以 UTC 為基準。
什麼是 UTC?
協調世界時(UTC)是世界調節時鐘和時間的主要時間標準。它取代了格林威治標準時間(GMT)成為國際標準,並由原子鐘維護。
為什麼 UTC 對 Unix 時間戳很重要?
- Unix 時間戳以 UTC 定義,因此時間戳在全球代表相同的時刻
- 將 Unix 時間戳轉換為當地時間純粹是顯示層面的問題
- 時間戳本身不儲存時區資訊,這使得系統簡單且可移植
這種設計意味著您可以與世界上任何人分享 Unix 時間戳,雙方都能不含歧義地將其轉換為自己的當地時間。
閏秒:罕見的例外
Unix 時間戳理論上計算自紀元以來的秒數,但它們忽略閏秒。增加了閏秒的一天在 Unix 時間中仍然剛好是 86400 秒。這意味著在閏秒期間,Unix 時間戳不會前進,該閏秒實際上從計數中消失了。
這種簡化保持了系統的實用性,但意味著 Unix 時間戳與原子時間之間存在輕微偏差。這個差異很小,在日常應用中很少構成問題。
常見時間戳範圍
| 時間戳 | 人類可讀日期 | 意義 | |-----------|---------------------|--------------| | 0 | 1970-01-01 00:00:00 UTC | Unix 紀元 | | 86400 | 1970-01-02 00:00:00 UTC | 紀元後一天 | | 946684800 | 2000-01-01 00:00:00 UTC | 2000 年 | | 1234567890 | 2009-02-13 23:31:30 UTC | 一個好記的規律數字 | | 1785292800 | 2026-07-19 00:00:00 UTC | 今天的紀元值 | | 2147483647 | 2038-01-19 03:14:07 UTC | 32 位元最大值 |
總結
Unix 時間戳是一種以單一整數表示時間的優雅且可移植的方式。其設計——從 1970 年 1 月 1 日 UTC 開始計算秒數——使其成為跨作業系統、資料庫和程式語言的通用時間標準。雖然 2038 年問題對舊版系統構成威脅,但向 64 位元時間的持續過渡確保了 Unix 時間戳將在未來數代中繼續作為計算時間計量的基石。
準備好使用 Unix 時間戳了嗎?使用我們的 Unix 時間戳轉換器 在時間戳與人類可讀日期之間即時轉換。