實驗場

JavaScript Date 演練場

輸入一個 JavaScript Date 運算式,即時探索每一種輸出格式和屬性 —— toISOString、toString、getTime、getFullYear 等。

JavaScript Expression

Type any expression that returns a Date or number.

JavaScript 的 Date 物件

JavaScript 內建的 Date 物件在內部將時間儲存為自 Unix 紀元(1970 年 1 月 1 日 00:00:00 UTC)以來的毫秒數。每個 Date 實例歸根結底只是這一個整數。各種方法——toISOString()、toString()、toLocaleString()——只是顯示同一底層值的不同方式。

處理 JavaScript 日期時的常見陷阱

JavaScript Date 的若干行為會讓經驗豐富的開發者也栽跟頭:

  • 月份從零開始:一月是 0,十二月是 11——顯示時務必加 1
  • new Date('2024-01-01') 解析為 UTC 午夜;new Date('2024/01/01') 解析為本地午夜
  • new Date(2024, 0, 1) 以本地時間建構 2024 年 1 月 1 日(月份從零開始)
  • Date.now() 回傳毫秒;Math.floor(Date.now() / 1000) 給出 Unix 秒
  • 不要用加 86400000ms 的方式來加天數——DST 可能使其落在錯誤的時間

在 JavaScript 中處理時區

JavaScript 的 Date 物件沒有時區屬性——它始終以 UTC 儲存。時區轉換在顯示時使用 Intl.DateTimeFormat API 處理。

  • new Intl.DateTimeFormat('en-US', { timeZone: 'Asia/Tokyo', dateStyle: 'full', timeStyle: 'long' }).format(date)
  • date.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })
  • new Intl.DateTimeFormat('en-CA', { timeZone: tz }).formatToParts(date) —— 回傳各個部分以便自訂格式化

如何閱讀 playground 輸出

playground 以多種檢視顯示同一個 Date 值,便於你快速發現單位和時區錯誤。先用 getTime 與 Unix 秒比較,再檢查 ISO 和本地字串。如果 ISO 日期正確但本地字串看起來不同,表示時間戳記沒問題,只是顯示時區變了。

  • getTime 始終是自 Unix 紀元以來的毫秒
  • Unix 秒是 getTime 除以 1000 並向下取整
  • toISOString 始終顯示帶結尾 Z 的 UTC
  • toString 和 toLocaleString 在沒有選項覆寫時顯示瀏覽器本地時區