概要
- 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開発者 にとって、今後の標準的な日時操作手段となる見込み