JavaScript 原生時間日期處理庫 - Temporal
介紹 Temporal 的時間日期處理
Introduction
Temporal 是 JavaScript 中即將推出的原生日期和時間處理 API(目前處於 Stage 3 提案階段),主要要解決現有 Date
API 的多項不足,它提供了更強大、更精確且更易於使用的功能,使開發者能夠更有效地處理日期和時間相關的操作。
主要特點包括:
- 不可變性:所有操作都會返回新物件,防止意外的資料修改
- 高精度:支援奈秒級別的時間精度,超越了
Date
的毫秒級別 - 時區支援:內建強大的時區處理能力,支援所有 IANA 時區
- 豐富的功能:支援更複雜的日期和時間運算,如日曆計算、重複事件等
- 嚴格的字串格式:提供統一的解析和格式化標準
- 支援非公曆系統:內建多日曆系統支援
安裝(僅適用於支援的環境):
Temporal 尚未被所有瀏覽器和 Node.js 版本原生支援,目前仍處於實驗階段,建議在使用前引入 polyfill
與熱門的 dayjs & moment 的差異
dayjs
和 moment
是目前 JavaScript 中非常流行的日期處理庫,但它們也存在一些限制和問題。以下是 Temporal 相較於這兩者的主要差異:
特性 | Temporal | dayjs & moment |
---|---|---|
原生支援 | 是(即將成為標準的一部分) | 否,需要額外安裝庫 |
不可變性 | 所有物件不可變,防止副作用 | moment 物件可變,dayjs 不可變 |
時間精度 | 支援奈秒級別 | 毫秒級別 |
時區處理 | 原生支援 IANA 時區,操作更簡便 | 需要額外外掛或手動處理時區 |
效能 | 更優化的效能表現 | moment 有效能瓶頸,dayjs 輕量化 |
API 設計 | 現代化、清晰且一致的 API 設計 | moment API 複雜,dayjs 簡潔但功能有限 |
型別支援 | 完整的 TypeScript 支援 | 需要額外的型別定義 |
核心概念
Temporal 提供了多個專門的類別來處理不同的時間日期場景,每個類別都有其特定的用途和優勢:
基礎用法
在開始使用 Temporal 之前,我們需要先引入相關依賴,並了解基本的操作方式:
引入 Temporal(使用 polyfill)
建立日期和時間物件
時間運算
使用 Hook 包裝 Temporal + TypeScript 加強可讀性
在 React 專案中,結合 Temporal 和 TypeScript 可以提升日期時間操作的可讀性和可維護性。以下示範如何創建一個自定義 Hook,封裝 Temporal 的功能。
安裝依賴
首先,確保安裝了 @js-temporal/polyfill
和 TypeScript。
建立倒數計時 Hook
在元件中使用倒數計時 Hook
說明
- Hook (
useCountdown
):- 參數:目標時間的 ISO 格式字串,可以根據團隊喜好去客製化期望的格式
- 狀態:包含倒數計時的
Temporal.Duration
- 效果:使用
setInterval
每秒更新一次狀態,確保倒數計時實時刷新 - 回傳值:返回當前的倒數計時狀態
總結
Temporal 作為下一代的日期時間處理標準,提供了更直覺的 API 設計、更安全的不可變特性、更完整的時區支援、更精確的時間處理和更好的型別支援,雖然目前仍處於提案階段,但其設計和功能都非常完善,值得開始學習和嘗試使用,隨著它逐漸成為 JavaScript 標準的一部分,掌握 Temporal 將有助於在未來的開發中更高效地處理日期和時間相關的需求。