**Temporal:JavaScript で時間を直すための9 年間の旅**

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

Date
の概念的な代替ですが、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

時間の正確な瞬間をナノ秒単位で測定します。

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.PlainDate
  • Temporal.PlainTime
  • Temporal.PlainDateTime
  • Temporal.PlainYearMonth
  • Temporal.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 オブジェクトと組み合わせて使える期間型です。

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 エンジン創設者、オープンソースプロジェクトへの貢献者

同じ日のほかのニュース

一覧に戻る →

2026/03/12 4:29

生成・AI で編集されたコメントを投稿しないでください。HN は人と人との対話の場です。

## 日本語訳: (すべての重要ポイントを含む)** このポリシーは明確な使命を示しています。ハッキング、スタートアップ、および関連技術テーマに関する好奇心駆動型ディスカッションを開催し、政治・犯罪・スポーツ・有名人ゴシップ(新たな現象が明らかでない限り)は厳格に除外します。 この焦点を維持するため、ガイドラインはオントピックとオフトピックのコンテンツを区別し、投稿にはオリジナルソースの使用(再投稿時は引用)を求め、タイトルで宣伝的言語を禁止します。タイトルは大文字・感嘆符・過剰な数字や形容詞を避け、サイト名を含まないようにし、代わりに強調のためにアスタリスクを使用できます。動画またはPDF投稿の場合、タイトルに「[video]」または「[pdf]」を付加します。 コメントは思慮深く実質的であることが期待されます。皮肉・浅い軽蔑・炎上誘発・政治/イデオロギー戦争は排除し、人物ではなく議論に対処すべきです。AI生成または編集されたコメントは禁止されており、全てのディスカッションは人間同士で行われることを意図しています。アップボートやコメントの要請は禁じられており、投票とコメントは真剣な関心から生まれるべきです。 モデレーションは過度に差し控えめな発言をフラグ付けすることに重点を置き、形式ルールを強化し、イデオロギー対立を会話から排除します。その結果、誤情報・センセーション主義・宣伝活動を抑制しつつ、集中した技術的探求を奨励するプラットフォームが実現されます。

2026/03/12 5:56

多くのSWE bench‑passing PR はマージされることがないでしょう。

## Japanese Translation: **概要:** 本研究では、2024年中頃から2025年末までに提出された296件のAI生成プルリクエスト(PR)を、scikit‑learn、Sphinx、および pytest の3つの主要なソフトウェア工学ベンチマークリポジトリで、4名の活発なメンテナーから検証しました。これらの PR の約半分は、メンテナーの判断にノイズを加えてもメインブランチへマージされませんでした。平均して、自動評価者(グレーダー)の合格率はメンテナーのマージ率より 24.2 パーセントポイント高く、統計的に有意であることが示されました。メンテナーの年次改善率はグレーダーのそれを約 9.6 pp/yr 遅れ、弱いながらも統計的に有意な結果でした。 メンテナーは主にコード品質(スタイル不備やリポジトリ標準への非準拠)を理由に PR を拒否しました。他の失敗要因としては既存コードの破損、コア機能の喪失、および自動グレーダーの失格が挙げられます。Claude 3.5 Sonnet から Claude 3.7 Sonnet へのモデルアップグレードにより合格率は上昇しましたが、同時にコア機能拒否も増加し、後続のアップグレードでは主にコード品質の改善が見られました。GPT‑5 は Anthropic モデルと比べてコード品質で顕著に劣り、マージ率を低下させました。 ヒューマン「ゴールデン」パッチは 68 % のメンテナー マージ率と約 90 % のマージ可能性向上率を示し、このベースラインがモデルスコアの正規化に使用されました。PR を再評価して ≥80 % のマージ可能性進捗に達した場合、結果は合格率分析と同様であり、AI パッチの約 50 % が閾値を満たし、ゴールデンパッチでは約 100 % に相当しました。時間軸解析では、自動グレーダーがメンテナー評価に対してモデル能力を約7倍過大評価していることが明らかになりました。 制限点としては、リポジトリカバレッジの限定(検証済みリポジトリ 3/12)、レビュー時の継続的インテグレーションの欠如、および静的評価に留まるパッチ評価が挙げられます。著者は、ベンチマークスコアからの単純な外挿は誤解を招くと結論付けており、メンテナーによるレビューこそがエージェント有用性をより現実的に測定する手段であると示しています。

2026/03/11 13:44

ウェブ上でWebAssemblyを第一級言語にする

## Japanese Translation: (欠落しているポイントを組み込む):** ## 要約 WebAssembly(Wasm)は2017年のデビュー以来、共有メモリ、SIMD、例外処理、テールコール、64ビットメモリ、ガベージコレクション、大量メモリ命令、複数戻り値、および参照値などの機能を追加しながら進化してきました。これらの技術的進歩にもかかわらず、Wasmは「二次的」なウェブ言語として位置づけられ続けています。というのも、すべてのモジュールが依然としてJavaScriptを介してロードされ、ブラウザAPIにバインドされる必要があるからです。 主な障壁は2つあります: 1. **面倒なロード** – JavaScript が `WebAssembly.instantiateStreaming` を使って手動でモジュールをフェッチし、インスタンス化する必要があります。 2. **APIアクセスにはグルーコードが必要** – WasmメモリとJSオブジェクト間の変換は言語固有であり、ビルドの複雑さを増加させ、実行時にオーバーヘッド(例:TodoMVCベンチマークで45%の遅延)が発生します。 `esm-integration` の提案では、`.wasm` モジュールを `<script type="module" src="/module.wasm">` で直接インポートできるようにし、ロードを簡素化しますが、グルーコード問題は解決されません。Clang/LLVMなどのコンパイラは依然としてベアWasmを出力し、開発者は JavaScript を埋め込む非公式ツールチェーンに頼ることが多いです。 **WebAssembly コンポーネントモデル** は解決策を提示します:コンポーネントは高レベルのIDL(WIT)と低レベルのWasmコードをバンドルし、ブラウザや他言語がインターフェースを直接インポートできるようにします。例えば、Rust コンポーネントは WIT を介して `import std:web/console` し、`console::log` を呼び出すことができます。そのコンパイル済みコンポーネントは `<script type="module" src="component.wasm">` でブラウザにロードされます。JavaScript はエクスポートされたインターフェース(例:画像デコーダ)をネイティブモジュールとして消費できます(`import { Image } from "image-lib.wasm"`)。 Mozilla と Google がこのモデルの構築に協力しており、Jco や Wasmtime などのツールはすでに開発者が実験できるようになっています。プラットフォーム統合のための JavaScript 依存を排除することで、コンポーネントモデルはビルドの複雑さ低減、パフォーマンス向上、および言語間相互運用性の拡大を約束し、WebAssembly のウェブエコシステム全体での採用を加速させる可能性があります。

**Temporal:JavaScript で時間を直すための9 年間の旅** | そっか~ニュース