Temporal: JavaScriptにおける時間を修正するための9年間の旅
概要
- BloombergはJavaScriptの標準化やインフラに深く関与
- Date APIの歴史的課題とその限界
- Moment.jsなどのライブラリ依存による新たな問題
- Temporal提案の誕生と発展の経緯
- Temporal APIの特徴と現状
BloombergとJavaScript標準化の歩み
- BloombergはJavaScriptの利用と標準化に積極的に関与
- 社内エンジニア向けにJavaScript環境を提供
- 2018年以降、TC39会議に参加し、RealmsやWebAssemblyなどの議論に貢献
- Igaliaとの協力による標準化推進
- Arrow Functions、Async Await、BigInt、Class Fields、Promise.allSettled、Promise.withResolvers、WeakRefs、Source Maps標準化支援
- Promise.allSettledやTemporal提案への貢献
JavaScriptの進化と標準化プロセス
- JavaScriptはブラウザ横断で動作、単独での仕様変更不可
- TC39(ECMAScript技術委員会)で進化
- 提案は複数の成熟度ステージを経て標準化
- Stage 0: アイデア
- Stage 1: 問題領域の承認
- Stage 2: 設計案の選定
- Stage 2.7: 原則承認、テスト・フィードバック待ち
- Stage 3: 実装とフィードバック
- Stage 4: 標準化
Date APIの歴史的背景と課題
- 1995年、Brendan EichがMocha(JavaScriptの前身)を10日で開発
- JavaのDate実装をそのまま移植
- 当時はJavaScriptをJavaの軽量版として設計
- APIの変更は政治的にも困難、一貫性優先
- Webが進化しても、Date APIはほぼ変化なし
Dateの主な問題点
- ミュータブル(変更可能)なオブジェクト設計
- 意図せず元のDateを変更してしまう
- 月単位の計算の一貫性欠如
- 例:1月31日に1ヶ月加算→3月2日になるなど直感に反する挙動
- 曖昧なパース
- 仕様外の文字列で挙動がブラウザごとに異なる
- ローカルタイム・UTC・エラーのいずれかになる不確定性
ライブラリエラの到来と課題
- Moment.jsなどのライブラリがDateの欠点を補完
- 強力なパース、イミュータブルなAPI、表現力の高い操作
- 100万回以上の週次ダウンロードを記録
- ライブラリ導入でバンドルサイズ肥大問題
- ロケール・タイムゾーン情報の同梱不可避
- Tree-shakingや最適化でも不要データの除去が難しい
Temporal提案と推進体制
- Maggie Johnson-Pintらが2017年にTemporal ProposalをTC39へ提出
- Stage 1到達後、要件整理や設計の明確化など地道な作業が続く
- Bloombergの要件
- ユーザーごとのタイムゾーン設定
- IANA Time Zone Databaseによる正確な歴史的タイムゾーン挙動
- ナノ秒単位の高精度タイムスタンプ
- IgaliaやGoogle、Microsoftなど多様な関係者が協力
- Championメンバー:Maggie Johnson-Pint、Matt Johnson-Pint、Brian Terlson、Richard Gibson、Philipp Dunkel、Ujjwal Sharma、Philip Chimento、Jason Williams、Shane Carr、Justin Grant
Temporal APIの概要と特徴
- Temporalはグローバルスコープのトップレベル名前空間オブジェクト
- MathやIntl同様、複数の型(コンストラクタ)を内包
- 代表的な型:Temporal.ZonedDateTime
- Dateの概念的な後継
- 明示的なタイムゾーンとカレンダーサポート
- 完全なイミュータブル設計
- サマータイムなどの複雑な計算も正確に対応
- 例:現在日時の取得
const now = Temporal.Now.zonedDateTimeISO();
- ZonedDateTime型は日時計算時にタイムゾーンやサマータイムの遷移を考慮
- 例:ロンドンのDST開始時の加算操作
まとめ
- Date APIの限界を克服するためにTemporalが標準化
- イミュータブル設計、高精度サポート、明確なタイムゾーン管理
- 業界横断の協力体制による長年の課題解決
- JavaScript開発者にとって、今後の標準的な日時操作手段となる見込み