本篇文章更新時間:2026/01/13
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
Date 要下台了,Temporal 正式接班
編輯前言:如果你曾在 JavaScript 中被日期搞得崩潰(尤其是那個詭異又反人性的 Date 物件),這篇文章一定會讓你拍案叫絕。來源自 Date is out, Temporal is in,作者用極具說服力的方式告訴我們:Temporal 的到來,是語言史的一個重要轉折。
核心觀點 (Key Takeaways)
- JavaScript 的 Date 設計粗糙、數值處理混亂、解析方式不一致,而且天生是可變的,導致非常容易誤用。
- Temporal 是全新的時間 API,不是建構子,而是像 Math 一樣的 namespace,結構清晰、語意明確。
- Temporal 的操作皆 回傳新物件,不會像 Date 那樣不小心改到原值,避免大量潛在 bug。
深入解析
這篇文章最精華之處,是它不只是抱怨 Date,而是從語言設計層面解釋 Date 的根本問題,以及 Temporal 如何從根本修正這些缺陷。
作者先用大量例子展示 Date 的混亂本質:
“Numeric months are zero-indexed, but years and days are not.”
這種「月從 0 開始、日和年從 1 開始」的規則,初學者一定踩雷。而且用字串建構時,”2026/1/2″、”2026-01-02″ 竟然會得出不同結果,其中一種還會錯掉一天。這不只荒謬,也讓 Date 在全球化、多語系、多時區的情境中變得難以維護。
另一方面,作者也指出 Date 最大、最本質的問題:它是 mutable 的物件。這意味著一旦你把 Date 作為參數傳入函式,稍微不注意就會改動到原本的時間值,造成各種預期外的副作用。
例如:
使用 addDay(today) 來計算明天時,today 也可能被意外改變。
Temporal 的設計哲學完全不同。它是由多個類別組成的 namespace,例如 Temporal.Now、Temporal.PlainDate、Temporal.Instant 等,每一個都專注處理具體且單一的任務。
- Temporal.Now.plainDateISO():直接取得當地日期(不含時間)
- date.add({ days: 1 }):語意明確、回傳新值、不中途改動原物件
- date.toZonedDateTime(“Europe/London”):明確處理時區,且可預期
作者展示 Temporal 的語法後,很直觀地指出它的優勢:不會修改原物件、表達清晰、語意一致、格式穩定。
筆者心得與啟發
老實說,身為一個寫了多年 JavaScript 的人,我對 Date 的感受與作者如出一轍:能不用就不用,一用就要心驚膽跳,深怕不小心動到原值或踩到解析坑。
Temporal 的出現,對我而言不只是 API 更新,而是一次 語言哲學的修正。它不只改善「用法」,更重新釐清了「什麼是時間、什麼是日期、什麼是時區」這些概念,讓程式碼回到符合直覺的狀態。
最重要的是,Temporal 讓我重新思考了一件事:
工具的設計,會深刻影響我們對世界的建模方式。
Date 的混亂讓我們習慣了 workaround,而 Temporal 則提供一條乾淨、清晰的道路。未來如果我要教初學者處理時間,我會毫不猶豫帶他們用 Temporal,因為它從語意到實作都更接近真實世界。
現在 Temporal 已在最新版 Chrome 與 Firefox 中提供實驗性支援,我非常建議大家開始試用。畢竟,確實替換 Date 的第二好時機,就是 Temporal.Now。
