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 在沒有選項覆寫時顯示瀏覽器本地時區