告別 Date 混亂時代:JavaScript 全新 Temporal API 登場,重新定義時間處理

當我們談到 JavaScript 處理日期與時間的方式時,往往令人頭疼。長久以來,Date 物件雖然是 JavaScript 唯一的原生解法,卻也充滿限制與問題。然而,這一切即將迎來重大轉變──JavaScript 即將引入全新的 Temporal 物件,它不只是功能升級,更是一場徹底改變時間邏輯處理方式的現代化革命。

這場變革其實醞釀已久。要追溯 Date 的歷史,可以回到 1995 年 JavaScript 誕生之初。當時的 Date API 借鏡自 Java 語言早期的 java.util.Date 實作,然而 Java 在兩年後便認知到其缺陷並捨棄重建;反觀 JavaScript,卻被迫與這套設計糾纏至今近 30 年。

在實際開發中,Date 的問題層出不窮。例如它僅支援本地時間與 UTC,對時區完全無解;解析日期字串常有不一致的行為;再加上 Date 是可變(mutable)的,導致即使是簡單的時間運算也可能潛藏難以追查的錯誤。若還牽涉夏令時間(Daylight Saving Time)或歷史曆法變化,錯誤更是難以避免。

因此,多數開發者紛紛轉向第三方函式庫,如 Moment.js、date-fns 等。但如今,一個嶄新又強大的選擇出現了──Temporal,它是為了取代 Date 而設計的現代化 API,提供更穩定、可預測且原生的時間處理能力。

那麼,Temporal 究竟改變了什麼?

以往開發者若需表示像「3 天 5 小時」這類時間區間,常得自行撰寫轉換邏輯,如今只需使用 Temporal.Duration 即可輕鬆表示。若需要處理具體時刻,例如伺服器接收資料的時間點,可以使用 Temporal.Instant。而若是針對特定時區的「牆上時間」(wall-clock time),則可透過 Temporal.ZonedDateTime 精準處理,不再擔心夏令時間切換等問題。

來自德國柏林的一位前端工程師 Lena 分享她的經驗:她所服務的新聞網站每日凌晨三點需向不同國家的讀者發送當地新聞摘要電郵。由於各地夏令時間起止不一致,她過去得為每個城市建立複雜條件,如今使用 Temporal.ZonedDateTime 並指定 "Europe/Berlin""America/New_York" 等時區,就能輕鬆解決排程問題。

不只如此,Temporal 也原生支援多種曆法系統,對需要處理節慶或文化事件的應用尤其重要。像是中國農曆新年、猶太逾越節、伊斯蘭齋戒月等,都可以透過 calendar 屬性來精準計算。不久前,舊金山工程師 Josh 開發一個社群活動平台,希望根據使用者信仰自動提醒重要節日。過去他得引用外部曆法資料手動比對,現在只需搭配 Temporal.PlainDate.withCalendar("hebrew") 等語法,便能輕鬆處理。

另一常見場景是處理 Unix 時間戳(從 1970 年起的毫秒數),這在 API、伺服器與資料庫應用中相當普遍。若你收到數值 1851222399924,可透過 Temporal.Instant.fromEpochMilliseconds() 轉為具體時間,然後配合 Temporal.Now.instant() 計算距離該時刻還有幾個小時,這樣的處理對金融、物流與即時系統尤其關鍵。

值得一提的是 Temporal 的 API 結構也相當優雅。例如要比較與排序時間區間,不再需要手動轉毫秒數再比較。你可以直接用 Temporal.Duration.compare() 排序,語法簡潔,邏輯清晰。例如以下程式碼:
const durations = [

Temporal.Duration.from({ hours: 1 }), Temporal.Duration.from({ hours: 2 }), Temporal.Duration.from({ hours: 1, minutes: 30 }), Temporal.Duration.from({ hours: 1, minutes: 45 }), ]; durations.sort(Temporal.Duration.compare); console.log(durations.map((d) => d.toString())); // 輸出: [ 'PT1H', 'PT1H30M', 'PT1H45M', 'PT2H' ]

目前 Temporal 尚未在所有主流瀏覽器中穩定支援。Firefox 進展最快,已在 Nightly 測試版中內建,只需開啟 javascript.options.experimental.temporal 選項即可。Chrome 與 Safari 則仍處於實作階段。不過,開發者無需等到全面支援才能開始探索──你可以造訪 TC39 官方網站(https://tc39.es/proposal-temporal/docs/),該網站內建 @js-temporal/polyfill,可直接在開發者工具中測試各種範例。

這樣的過渡階段,讓人聯想到當年 fetch API 漸漸取代 XMLHttpRequest 的過程──一開始大家透過 polyfill 熟悉語法,最終自然過渡。Temporal 也正站在這個轉型門檻上,對經常處理時間資料的開發者而言,現在正是學習與導入的最佳時機。


回顧這段歷史,JavaScript 與時間的糾結終於迎來新篇章。從模糊不清、行為詭異的 Date,邁向結構嚴謹、邏輯現代的 Temporal,這不僅是語言設計的進化,更象徵著開發文化對「正確處理時間」的堅持與承諾。

畢竟,時間從來不只是毫秒數,它承載著我們與世界互動的節奏。而 JavaScript,終於準備好以更尊重時間的方式來前進了。

留言