裝置與系統問題

把 Unix 時間戳換成日期:秒與毫秒、UTC 一次講清

將 Unix 時間戳轉換為日期。釐清秒對毫秒、UTC 對本地時刻、ISO 8601,以及日期如何再變回 epoch 時間。

快速解答

Unix 時間戳用來表示相對 Unix epoch 的時間,起點是 1970-01-01 00:00:00 UTC。實務上多存成 epoch 之後的秒數,或之後的毫秒數。

轉換之前得先知道單位。1720000000 以秒計等於 2024-07-03 09:46:40 UTC;1720000000000 以毫秒計則是同一瞬間。

時間戳指出的是某一瞬間。UTC、本地時刻或 IANA 時區,只改這個瞬間的呈現方式。

本文講轉換:時間戳→日期、日期→時間戳、UTC 與本地、ISO 8601。若結果突然變成 1970,通常是秒與毫秒對不上。請看 Unix Timestamp 的秒與毫秒:日期為什麼會變成 1970。

Unix 時間戳是什麼?

Unix timestamp、Unix time、epoch time 多半指自 1970-01-01 00:00:00 UTC 起算的經過時間。數字本身不是附時區標籤的日期字串。同一瞬間在 UTC、紐約、東京或首爾,鐘面上的時刻可以不同。Unix 時間戳並非一律用秒——實務常見毫秒。

Unix epoch 指的是哪一刻?

Unix epoch 定義為 1970-01-01 00:00:00 UTC。時間戳 0 就是那一瞬間。正值落在 epoch 之後。部分系統允許負值表示 epoch 之前,但程式語言與日期範圍支援並不一致。

這串時間戳該當秒還是毫秒?

1720000000 為秒,1720000000000 為毫秒,兩者是同一瞬間。實用線索:約 10 位數往往是秒,約 13 位數往往是毫秒。位數只是啟發式判斷。過去或未來的日期、其他單位、自訂 epoch 都會讓外形不同。日期與時間轉換器 可用秒、毫秒或自動(≤10 位當秒,≥13 位當毫秒)轉換——若已知單位,請自行指定。

單位用錯,為何日期會整個跑掉?

JavaScript Date 預期毫秒。把 1720000000 當毫秒傳入,會得到 1970-01-20 21:46:40 UTC。毫秒當秒、或秒當毫秒,都會落到差很遠的日期。1970 排查請見 Unix Timestamp 的秒與毫秒:日期為什麼會變成 1970。

new Date(1720000000);
// 1970-01-20T21:46:40.000Z

秒單位的 Unix 時間戳怎麼轉

秒乘上 1000 即毫秒。JavaScript Date 以毫秒為基底,因此使用 new Date(timestamp * 1000)。

const timestamp = 1720000000;
const date = new Date(timestamp * 1000);
date.toISOString();
// 2024-07-03T09:46:40.000Z

毫秒時間戳該怎麼轉

毫秒請直接交給 Date。已是毫秒的時間戳不要再乘一次 1000。

const timestamp = 1720000000000;
const date = new Date(timestamp);
date.toISOString();
// 2024-07-03T09:46:40.000Z

同一時間戳為何鐘點不一樣?

Unix 時間戳標的是同一瞬間。改以 UTC、本地時刻或指定的 IANA 時區呈現,鐘面上的數字才會不同。就 1720000000000 而言,UTC 為 2024-07-03 09:46:40。該日 America/New_York 則是 2024-07-03 05:46:40(EDT)。Asia/Seoul 為 2024-07-03 18:46:40(UTC+9)。紐約與首爾這兩個值由 Intl 算出,並非「永遠固定偏移」的口號。

Unix 時間戳有沒有內含時區?

沒有。它不會存放 America/New_York 或 Asia/Seoul。時間戳只識別瞬間。時區是在把該瞬間格式化成可讀日期時間時才套用。epoch 以 UTC 為基準來定義;數字本身並不是「UTC 時區欄位」。

Unix 時間戳對上 ISO 8601

1720000000 與 2024-07-03T09:46:40Z 可以代表同一瞬間。Unix 是經過時間的數值。ISO 8601 是可讀的日期時間字串,結尾可以是 Z(UTC)或數字偏移。Z 代表 UTC,有時稱 Zulu。兩者格式不同。

目前的 Unix 時間戳怎麼取?

在 JavaScript 中,Date.now() 為毫秒;Math.floor(Date.now() / 1000) 為秒。文章裡不要把「現在」寫死,因為它一直在變。

Date.now();
Math.floor(Date.now() / 1000);

日期能否再轉回 Unix 時間戳?

可以。從明確的 UTC ISO 字串出發,getTime() 回傳毫秒;除以 1000 並無條件捨去即得秒。

const date = new Date("2024-07-03T09:46:40Z");
date.getTime();
// 1720000000000
Math.floor(date.getTime() / 1000);
// 1720000000

含糊的日期格式要小心

03/07/2024 依地區可能是 3 月 7 日或 7 月 3 日。請優先使用帶時區或偏移的 ISO 風格。日期與時間轉換器 會拒絕 01/02/2026 這類含糊數字日期,並要求日期選擇器或 ISO 風格的值。

日光節約時間怎麼辦?

Unix 時間戳沒有另外存 DST 旗標。本地顯示時才套用該區規則。America/New_York 冬夏偏移不同,因此不能把紐約說成全年都是 UTC-5。

Unix 時間戳有沒有把閏秒算進去?

典型的 POSIX/Unix time 不會把閏秒當成連續尺標上多出來的 SI 秒。各平台可能不同。日常轉換不必理會這層細節。

轉換 Unix 時間戳時常見的錯法

下列混淆會產出錯誤日期或錯誤鐘面:

將秒誤當成毫秒
現代的秒值丟進 JavaScript Date 後,會落在 1970 附近。

將毫秒誤當成秒
日期會跳到遙遠的未來。

把 10 位或 13 位當成定律
位數只是線索,並非保證。

把 UTC 跟本地時刻搞混
瞬間相同,顯示出來的鐘點可以不同。

以為時區寫在數字裡
IANA 名稱在顯示時才套用,並未存在時間戳之中。

含糊日期、DST 口號,或多乘一次 ×1000
請用 ISO 風格輸入。毫秒時間戳不要再乘一次。

已核對的 UTC 實例

這些 UTC 鐘面時刻是計算而得,不是臆測:

輸入值 計量單位 UTC 時刻
0 以秒計 1970-01-01 00:00:00
1720000000 以秒計 2024-07-03 09:46:40
1720000000000 以毫秒計 2024-07-03 09:46:40
1720000000 以毫秒計 1970-01-20 21:46:40

轉換時可依循的簡要流程

來源若寫明單位,就採用該單位。若無,位數可當線索——接著確認日期是否合理。API 需要毫秒時,把秒轉成毫秒。顯示可選 UTC、本地或某個 IANA 時區。ISO 8601 利於儲存與交換。

  • 已有 Unix 時間戳
  • 單位有註明嗎?有就用;否則先看數量級
  • 若是秒,API 要毫秒就 ×1000
  • 若是毫秒,在毫秒 API 直接使用
  • 以 UTC、本地或 IANA 時區呈現
  • 若需要字串,ISO 8601 往往合適
數字是瞬間;格式化才決定鐘面長什麼樣子。
時間戳是瞬間,不是顯示格式本身

時間戳指出的是時間上的一點。UTC、本地時刻或時區,只決定這個瞬間要怎麼給人看。

在瀏覽器轉換 Unix 時間戳

NEXNARA 日期與時間轉換器 可轉換 Unix 的秒與毫秒,顯示 UTC、本地時刻與 ISO 8601,並在 IANA 時區之間互轉。

Unix 模式支援秒、毫秒、自動單位、目前時間,以及日期轉時間戳。時區模式可搜尋 IANA 名稱、採用瀏覽器時區,並套用考量夏令時間的 Intl 偏移。格式模式提供依地區可讀的輸出、12/24 小時制,以及含糊日期防護。日期差是另一個模式。

轉換倚賴瀏覽器的 Date 與 Intl API。超出 Date 可表示範圍的值會被拒絕。自動單位不會猜測 11–12 位的值;請自行選秒或毫秒。

日期與時間戳的轉換本身在瀏覽器內完成。轉換過程不會把輸入送到 NEXNARA 伺服器。廣告與其他網站功能仍會使用網路。

把時間戳貼到 日期與時間轉換器,先對照 UTC、本地時刻與 ISO 8601,再決定單位。

FAQ

Unix 時間戳要怎麼轉成日期?

先確認單位。JavaScript 的秒請用 new Date(n * 1000),毫秒請用 new Date(n),再格式化成 UTC、本地或指定時區。

Unix 時間戳究竟用秒還是毫秒?

兩種都有可能。約 10 位往往是秒,約 13 位往往是毫秒,但這是啟發式判斷,不是規則。

為什麼時間戳會顯示成 1970?

通常是秒被當成毫秒來讀。請看 Unix Timestamp 的秒與毫秒:日期為什麼會變成 1970。

Unix 時間戳是否一律等於 UTC?

epoch 以 UTC 為基準定義,數字識別的是瞬間。顯示用的時區是另一回事。它並非儲存好的「UTC 時區欄位」。

Unix 時間戳有沒有帶時區?

沒有。它不攜帶 IANA 識別碼。時區是在格式化該瞬間時才套用。

日期要怎麼轉成 Unix 時間戳?

從 UTC ISO 字串出發,date.getTime() 是毫秒;Math.floor(date.getTime() / 1000) 是秒。