Unix 時間戳常見問題
對最常見的 Unix 時間戳問題的快速解答 —— 單位、時區處理、2038 年問題、各語言的轉換等。
常見問題
- 什麼是 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 位)或奈秒。合適的單位取決於你的應用實際需要的精度。