Unix 時間戳常見問題

對最常見的 Unix 時間戳問題的快速解答 —— 單位、時區處理、2038 年問題、各語言的轉換等。

常見問題

關於 Unix 時間戳記、紀元時間、時區以及如何正確儲存時間的常見問題——按主題整理。把答案當作快速參考;更深入的指南連結在頁面底部。

接下來去哪

FAQ

什麼是 Unix 時間戳記?
Unix 時間戳記是自 Unix 紀元——1970 年 1 月 1 日 00:00:00 UTC——以來經過的秒數。它是一個與語言無關、與時區無關的整數,可唯一標識任意時刻。
什麼是 Unix 紀元?
Unix 紀元是 1970 年 1 月 1 日 00:00:00 UTC。所有 Unix 時間戳記都從這個固定參照點向前測量——負值則向後。選擇 1970 年是出於實用考量:在貝爾實驗室設計 Unix 時,這是一個較近且整齊的年份。
10 位和 13 位時間戳記有什麼區別?
10 位時間戳記(例如 1700000000)表示自紀元起的秒數。13 位時間戳記(例如 1700000000000)表示毫秒。JavaScript 的 Date.now() 回傳毫秒;大多數 Unix 系統呼叫以及 Python、Go、PHP 等語言預設回傳秒。
為什麼 JavaScript 使用毫秒而不是秒?
JavaScript 的 Date API 設計時是為了匹配 1995 年可用的系統計時器解析度。使用毫秒可避免亞秒時長的精度損失。處理伺服器產生的以秒為單位的 Unix 時間戳記時,請在傳給 new Date() 之前乘以 1000。
在 JavaScript 中如何把 Unix 時間戳記轉換為可讀日期?
對於秒時間戳記:new Date(1700000000 * 1000).toISOString()。對於毫秒時間戳記:new Date(1700000000000).toISOString()。兩者都生成形如 '2023-11-15T06:13:20.000Z' 的 ISO 8601 字串。本地化顯示請使用帶 timeZone 選項的 toLocaleString()。
Unix 時間戳記能感知時區嗎?
不能。Unix 時間戳記始終表示 UTC 中的單一時刻。時區資訊僅在為顯示而格式化時間戳記時才套用。兩台位於不同時區的裝置對同一時刻會生成相同的 Unix 時間戳記。
什麼是 2038 年問題?
將 Unix 時間戳記存為 32 位有號整數的系統只能表示到 2,147,483,647 的值,對應 2038 年 1 月 19 日 03:14:07 UTC。過了那一刻,整數會溢位為一個很大的負數。現代 64 位系統不受影響,但嵌入式系統和遺留資料庫可能仍有風險。
什麼是負的 Unix 時間戳記?
負的 Unix 時間戳記表示 Unix 紀元之前的時刻。例如,-86400 是 1969 年 12 月 31 日 00:00:00 UTC。大多數現代日期 API 能正確處理負時間戳記,但一些較舊的系統和資料庫不支援它們。
在 Python 中如何取得 Unix 時間戳記?
秒用 import time; int(time.time())。需要明確 UTC datetime:import datetime; int(datetime.datetime.now(datetime.timezone.utc).timestamp())。毫秒用:int(time.time() * 1000)。
Unix 時間戳記的精度如何?
標準 Unix 時間戳記為一秒精度。對於亞秒精度,毫秒時間戳記(13 位)在 Web API 和 JavaScript 中很常見。有些系統使用微秒(16 位)或奈秒。合適的單位取決於你的應用實際需要的精度。
Unix 時間戳記能有多大?
在 64 位有號整數(如今的標準)上,Unix 時間戳記可表示從約 2920 億年前到 2920 億年後的任意時刻。著名的 32 位限制(2038 年問題)只適用於遺留系統。
為什麼我的時間戳記顯示 1970?
通常是三種原因之一:值為 0(紀元本身)、值是毫秒卻被當作秒處理(於是被捨入到接近 0 的極小秒值),或值為 null/undefined 而你的程式碼預設將其設為 0。
UTC 和 GMT 有什麼區別?
在大多數情況下 UTC 和 GMT 可互換。UTC(協調世界時)是現代原子標準;GMT(格林威治標準時間)是表示零偏移時區的遺留術語。英國和大多數軟體將二者視為等價。
應該把日期存為 Unix 時間戳記還是 ISO 8601 字串?
兩者都行。Unix 整數緊湊且便於比較;ISO 8601 字串自描述且人類可讀。在資料庫中,原生 datetime 型別(Postgres 的 TIMESTAMP WITH TIME ZONE、MySQL 的 DATETIME(6))通常最好,因為它們保留時區語意且能高效建立索引。
儲存我伺服器的本地時間安全嗎?
不安全。在不帶偏移的情況下儲存本地時間,會在伺服器遷移、DST 變更,或另一個時區的另一台伺服器讀取該值時遺失資訊。請儲存 UTC(作為 Unix 時間戳記或帶時區的 datetime),僅在顯示層轉換為本地時間。
Unix 時間戳記包含閏秒嗎?
POSIX Unix 時間有意忽略閏秒——即使插入一個額外的 UTC 秒,每個 Unix 日也正好是 86,400 秒。實際的秒編號會被重複,或者時鐘被抹平,具體取決於系統。