SJ blog
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.jsdate-fns などのライブラリへの依存が不要になります。Math.sumPreciseusing も地味ながら実用的です。

Chrome 144+ / Firefox 139+ / Edge 144+ でネイティブ対応済みなので、今すぐ使い始められます。


参考: The New Stack - ES2026 / MDN Temporal