はじめに
JavaScript や Node.js で日付を扱う古典的な方法としては Date が存在しています。
しかし、このライブラリは多くの問題を抱えています。
- ローカル時間とグローバル時間の区別がない。
- 時間差の概念が存在しない。
- 日付の解析に関して仕様が存在しない。
- 月を 0-11 で扱う。
- 変更可能で、参照渡しにより勝手な改変がされる。
このように多くの問題を抱えていたことから、Moment.js や date-fns のような外部ライブラリに依存する状況が長らく続いていました。
2026-05-05 (ISO 8601 表記) に公開された Node.js 26.0.0 では、新しく Temporal が日付ライブラリとして標準になりました。
この記事では、Temporal クラスについて解説します。
Temporal
Temporal は次世代の日付ライブラリで、Math オブジェクトのように多くの関数が Static メソッドとして定義されています。
一方で、PlainDate.from() などで生成したインスタンスには .add() や .until() といったインスタンスメソッドも多数用意されており、Static メソッドとインスタンスメソッドを組み合わせた設計となっています。
議論の前提において、Temporal は Date であった主要な仕様上の不備は全て改修されている全く新しい設計思想のライブラリです。
そのため、Date にあったような設計上の不備は基本的に存在しません。
実用面に着目して、実用する際の機能が実装されているか? という点を確認します。
主たる機能について、Temporal および主要なライブラリである Moment.js と date-fns を比較して、その強さについてみてみます。
ローカリゼーション
タイムゾーンや DST (夏時間)、ローカライズは、ローカリゼーションに必要な機能です。
Date 型では、ローカルタイムでの取り扱いが基本であり、UTC の取り扱いを不得意としていました。
多くのライブラリでもプラグイン扱いとなっており、対応が難しい領域です。
| 機能 | Temporal | Moment.js | date-fns |
|---|---|---|---|
| タイムゾーン | |||
| タイムゾーン指定 | 対応 | プラグインmoment-timezone |
別ライブラリdate-fns-tz |
| タイムゾーン変換 | 対応.withTimeZone |
プラグイン.tz |
別ライブラリutcToZonedTime |
| オフセット取得 | 対応offsetNanoseconds |
対応.utcOffset |
別ライブラリgetTimezoneOffset |
| DST (夏時間) | |||
| DST 処理 | 正確(考慮済み) | 部分的(known issue) | 別ライブラリdate-fns-tz |
| DST 折り返し時刻 | 対応disambiguation |
非対応 | 非対応 |
| ローカライズ | |||
| ロケールフォーマット | Intl 委譲 | ロケール読込.locale |
ロケール読込date-fns/locale |
| カレンダーシステム(和暦ほか) | 対応PlainDate.from({calendar:'japanese'}) |
非対応 | 非対応 |
入出力
日付データは、文字列などの様々な形式で外部システムと連携します。
入出力に関わる機能は、外部連携や表示に対して求められる主要機能です。
| 機能 | Temporal | Moment.js | date-fns |
|---|---|---|---|
| Parse | |||
| ISO 8601 | 厳密 | 対応 | 対応 |
| カスタムフォーマット | 非対応 | 対応 | 対応 |
| オブジェクト構築 | 対応 | 対応 | 非対応 |
| Format | |||
| ISO 8601 | 対応toString |
対応toISOString |
対応formatISO |
| カスタムフォーマット | Intl 委譲(部分的) | 対応format |
対応format |
| Unixtime | |||
| Unix 秒 → 日付 | 対応fromEpochSeconds |
対応moment.unix |
対応fromUnixTime |
| 日付 → Unix 秒 | 対応epochSeconds |
対応unix |
対応getUnixTime |
計算
日付の計算は、足し算・引き算のような四則演算だけでなく、月初めや期間といった複雑な計算を必要とします。
そのため、これらに対応できることは活用において重要です。
| 機能 | Temporal | Moment.js | date-fns |
|---|---|---|---|
| 加算 / 減算 | |||
| 加算 | Immutable | Mutable | Immutable |
| 減算 | Immutable | Mutable | Immutable |
| 期間の開始・終了 | |||
| 日の開始・終了 | 対応with({hour:0,…}) |
対応startOf('day') |
対応startOfDay |
| 週の開始・終了 | 非対応 | 対応startOf('week') |
対応startOfWeek |
| 月の開始・終了 | 対応with({day:1,…}) |
対応startOf('month') |
対応startOfMonth |
| 期間 | |||
| 差分 | 対応until |
対応diff |
対応differenceInDays |
| Duration | 対応Duration |
部分的duration |
非対応 |
その他
| 機能 | Temporal | Moment.js | date-fns |
|---|---|---|---|
| Immutable | 対応 | 非対応 | 対応 |
| 型分離 | 対応 | 単一型 | 単一型 |
| メンテナンス | ネイティブ | メンテナンスモード | コミュニティ |
まとめ
機能比較のとおり、主たる用途において Temporal は他のライブラリに比べて機能的に優れており、ネイティブで利用できる強力な日時ライブラリとなります。
今後の用途においては Temporal の利用が推奨されております。
今までサードパーティライブラリに依存して処理を行っていた『日時』という基本機能を、ファーストパーティだけでこれほどまでに活用できるようになったことは革新的です。
まさに、Temporal は Node.js 26 の目玉機能といえるでしょう。