frontend
S
信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
ES2026新機能:Temporal APIでJavaScriptのDate問題に終止符
TC39 Stage 4を通過したTemporal APIがChrome 144+でネイティブ対応。不変オブジェクト・タイムゾーン・正確な日付演算など、長年の問題をまとめて解決する新APIを解説します。
一言結論
Temporal APIはDateの可変性・月の0始まり・タイムゾーン計算バグを一挙に解決する設計で、Chrome 144+とNode.js 24でネイティブ利用可能になった今、新規コードでDateオブジェクトを使い続ける理由はほぼない。
JavaScript の Date は壊れていた
Date オブジェクトは 1995 年に実装されて以来、ほぼ変わっていません。主な問題点:
- mutable(可変):
date.setMonth(1)のような破壊的操作 - タイムゾーン計算のバグ: UTC と ローカル時間の混在
- 月の加算ミス: 1月31日に1ヶ月足すと3月3日になる(うるう年考慮なし)
- 直感に反する月番号: 月は 0 始まり(1月 = 0)
// 古いDateの罠
const d = new Date("2026-01-31");
d.setMonth(d.getMonth() + 1); // → 3月2日や3日になる(バグ)
// 月が0始まりの罠
new Date(2026, 0, 1); // 1月1日(0 = January)
Temporal API とは
Temporal は ECMAScript 2026 で Stage 4 に到達(2026年3月11日)し、Chrome 144+・Firefox 139+・Edge 144+ でネイティブサポートされました。
主要オブジェクト
| オブジェクト | 用途 |
|---|---|
Temporal.PlainDate | 日付のみ(時間・タイムゾーンなし) |
Temporal.PlainDateTime | 日付 + 時間(タイムゾーンなし) |
Temporal.ZonedDateTime | タイムゾーン付きの完全な日時 |
Temporal.PlainTime | 時間のみ |
Temporal.Duration | 期間(「3日と2時間」など) |
Temporal.Now | 現在時刻の取得ユーティリティ |
コードで見る改善点
不変オブジェクト
const date = Temporal.PlainDate.from("2026-01-31");
const nextMonth = date.add({ months: 1 });
console.log(date.toString()); // "2026-01-31"(変わらない)
console.log(nextMonth.toString()); // "2026-02-28"(正しい!)
タイムゾーン対応
// ニューヨークの現在時刻
const nyTime = Temporal.Now.zonedDateTimeISO("America/New_York");
// 東京↔ニューヨーク変換
const tokyoTime = Temporal.Now.zonedDateTimeISO("Asia/Tokyo");
const asNY = tokyoTime.withTimeZone("America/New_York");
Duration の比較
const a = new Temporal.Duration(0, 0, 0, 0, 25); // 25時間
const b = new Temporal.Duration(0, 0, 0, 1); // 1日
const cmp = Temporal.Duration.compare(a, b, {
relativeTo: Temporal.Now.plainDateISO()
});
// cmp === 1(25時間 > 1日)
日付の比較
const d1 = Temporal.PlainDate.from("2026-03-01");
const d2 = Temporal.PlainDate.from("2026-04-01");
d1.until(d2).days; // 31(正確な差分)
Temporal 以外の ES2026 新機能
Math.sumPrecise() — 浮動小数点の精度問題を解決
// 従来の問題
0.1 + 0.2; // 0.30000000000000004
// Math.sumPrecise は精度が保証される
Math.sumPrecise([0.1, 0.2]); // 0.3
using / await using — リソース自動解放
// ファイルや DB 接続を自動クローズ
{
using conn = openDatabaseConnection();
// スコープを抜けると自動で conn.dispose() が呼ばれる
}
import defer — モジュールの遅延評価
import defer * as heavyModule from "./heavy.js";
// ここではまだ評価されない
// 実際にアクセスした瞬間にロード
const result = heavyModule.compute(); // ここで初めてロード
まとめ
ES2026 の目玉はなんといっても Temporal API です。Date の問題を根本から解決しつつ、moment.js や date-fns などのライブラリへの依存が不要になります。Math.sumPrecise や using も地味ながら実用的です。
Chrome 144+ / Firefox 139+ / Edge 144+ でネイティブ対応済みなので、今すぐ使い始められます。