🕐
← 返回教學列表

什麼是 Unix 時間戳?完整指南

· 標籤: unix-timestamp, epoch, linux-time, 2038-problem, utc, time-conversion

什麼是 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 時間戳轉換器 在時間戳與人類可讀日期之間即時轉換。