Skip to content
tutorials

JavaScriptのDateオブジェクトは公式に廃止されました

数十年にわたり、JavaScriptのDateオブジェクトはバグとフラストレーションの源となってきました。新しいネイティブAPIの登場により、Moment.jsやLuxonのようなライブラリ全体が不要になろうとしています。

Marcus Lee
JavaScriptのDateオブジェクトは公式に廃止されました

なぜすべての開発者が new Date() を嫌うのか

なぜほぼすべてのJavaScript開発者が日付を扱う際にLuxonやdate-fnsのようなライブラリに頼るのか、不思議に思ったことはありませんか?組み込みの Date オブジェクトは信頼性が低いことで悪名高く、絶え間ないフラストレーションの源となっています。なぜこのオブジェクトがこれほど多くの苦悩を引き起こすのか、理解すべき時が来ています。

単純なクエリを考えてみましょう。new Date('0') は何を返すでしょうか?Unixエポックである1970年1月1日を期待するかもしれません。しかし、JavaScriptは文字列の "0" を2000年として解釈します。これに対し、new Date(0) は正しく1970年1月1日を返します。この一貫性のない解析は危険な罠です。

問題は Date.parse() でさらに深まります。このメソッドは文字列のみを操作します。そのため、Date.parse(0) を呼び出すと、JavaScriptは数値の 0 を暗黙的に文字列の "0" に変換します。その結果、Date.parse(0)Date.parse("0") と同様に2000年を返します。この暗黙の型変換は、デバッグが非常に困難な、静かで予測不可能なバグを生み出します。

歴史的に、Date オブジェクトの設計は当初から問題があり、1995年に導入されたJavaの java.util.Date を模倣していました。これはJava自身がその欠陥により1997年までに非推奨としたAPIです。この遺産により、JavaScriptには ミュータブル(変更可能) な日付オブジェクトが残され、操作によって元の値が予期せず変更される可能性があります。さらに、不十分で一貫性のない タイムゾーンサポート により、正確なグローバルな日付と時刻の処理がほぼ不可能になっています。

Temporal:日付の新しい時代

Temporalは、JavaScriptの日付に関する悩みに答える待望の解決策として登場しました。9年間の開発期間を経て、2026年3月にStage 4に到達したプロジェクトです。その設計哲学は イミュータブル(不変性) に重点を置いており、すべての操作が新しいオブジェクトを作成するため、古い Date オブジェクトを悩ませていた予期せぬ副作用を排除します。この予測可能性により、元の日付値が変更されないため、デバッグが大幅に簡素化されます。

モノリシックな Date オブジェクトは姿を消し、明示的で 強力に型付けされたオブジェクト のスイートに置き換わりました。この明確な責務の分離により、意図が即座に明らかになります。1つのオブジェクトですべてを不十分に行うのではなく、Temporalは特定のタスクのための専門的なツールを提供します:

  • PlainDate:時刻やタイムゾーンを含まないカレンダー上の日付。
  • PlainTime:日付やタイムゾーンを含まない壁時計の時刻。
  • Instant:Unixエポックからのナノ秒単位で測定される、タイムゾーンやカレンダーを持たない特定の時点。
  • ZonedDateTime:夏時間を完全に理解した、現実世界のタイムゾーンにおける完全な日付と時刻。
  • Duration:手動でミリ秒を計算することなく、正確な日付演算を可能にする。

この新しい構造により、日付の演算と比較が劇的に簡素化されます。ミリ秒をやりくりしたり、タイムゾーンの挙動を推測したりする必要はもうありません。Temporalは夏時間の切り替えのような複雑な処理を自動的に行います。例えば、タイムゾーンをまたぐフライトの到着時刻の計算は、APIが追加の労力なしで時計の変更を考慮するため、信頼性が高く読みやすいものになります。

不可能なタイムゾーンの謎を解く

タイムゾーンと夏時間(DST)は、歴史的に開発者にとって大きなフラストレーションの源でした。古い Date オブジェクトはこれらの複雑さを処理するように構築されておらず、複雑な回避策を強いられたり、大規模な外部ライブラリに頼らざるを得ませんでした。ありがたいことに、Temporal は、かつては不可能だったこれらの謎を驚くほどシンプルで予測可能なものにします。

ニューヨーク発ロンドン行きのフライトを想像してみてください。10月24日(日)のニューヨーク時間午後8時に出発し、所要時間は7時間です。ロンドンは5時間進んでいます。単純に計算するとロンドン到着は午前8時と思われがちですが、このフライトは夏時間(DST)で時計が「戻る」タイムゾーンを通過します。Temporalの ZonedDateTime を使えば、この切り替えを自動的に考慮し、ロンドン到着時刻を正しく午前7時と算出できます。getTimeZoneTransition() を使用して、正確な変更時間を確認することも可能です。

もう一つの一般的なシナリオとして、会議のリスケジュールを考えてみましょう。午前11時の会議を1日後ろ倒しにする際、夏時間(DST)の影響で夜間に時計が変更されると、意図せず午前10時になってしまうのは避けたいはずです。ZonedDateTime は、カレンダー上の日付と壁時計の時間を扱っていることを理解しています。そのため、夏時間の切り替えに関係なく、会議の時間を午前11時に正確に維持します。

このレベルの精度と自動処理により、日付計算は劇的に簡素化されます。以前は、開発者が複雑な手動のオフセット計算を行ったり、Moment.jsやLuxonのような重いライブラリに頼る必要がありました。Temporalの明確で予測可能なAPIは、その複雑さを完全に排除します。その機能の全体像については、公式の提案ドキュメントをご覧ください:Temporal - TC39

この記事が気に入ったら、毎朝同じようなものをメールで受け取れます。

1日1通 · 2クリックで解除 · サードパーティのトラッキングなし

日付を超えて:ES2027のその他のアップグレード

日付以外にも、ES2027では using キーワードによる Explicit Resource Management(明示的なリソース管理) が導入されます。この洗練された追加機能により、ファイルハンドルやデータベース接続といった重要なリソースのクリーンアップが自動化されます。手動で try-finally ブロックを書く代わりに、JavaScriptはスコープを抜ける際にオブジェクトの Symbol.dispose メソッドを自動的に呼び出し、メモリリークを防ぎます。非同期のクリーンアップには await usingSymbol.asyncDispose と同様の保証を提供し、DisposableStack が複数のリソースの順序立てた破棄を管理します。この機能は5月にステージ4に到達し、すでにChrome、Firefox、Node.js、Bun、Denoで利用可能です。

次に、Iterator.zip の登場により、一部のヘルパーライブラリへの依存に別れを告げることができます。この機能は、複数の配列やイテラブルを並列に結合し、対応する値の配列を提供します。名前付きの結果が必要な場合は、zipKeyed がオブジェクトベースの出力を提供します。また、mode オプションを通じて、長さの異なるイテラブルも適切に処理できます:

  • "shortest"(デフォルト):最も短いイテラブルで停止します
  • "longest":最も長いイテラブルが終了するまで継続し、オプションで padding を指定可能です
  • "strict":長さが異なる場合に TypeError をスローします

これはイテレーターヘルパーの進化を継続するものであり、一般的なデータ変換のためにLodashのようなライブラリを必要とする場面を減らします。

最後に、その他のエキサイティングな提案にも注目してください。ステージ3の Promise.allKeyed は、並列プロミスを処理するためのよりクリーンな方法を提供し、位置ベースの配列ではなく名前付きの結果を持つオブジェクトを返します。さらに先を見据えると、ステージ1の Signal 提案はネイティブなリアクティビティを約束しており、JavaScriptフレームワークが状態や更新を管理する方法を根本から変える可能性があります。これらのアップグレードは、Temporalと並んで、言語にとっての大きな前進を意味します。

よくある質問

JavaScriptのTemporal APIとは何ですか?

Temporalは、現代の日付および時刻機能のためのトップレベルの名前空間として機能する、JavaScriptの新しい組み込みグローバルオブジェクトです。問題の多いレガシーなDateオブジェクトを置き換える、包括的で不変(イミュータブル)、かつユーザーフレンドリーなAPIを提供します。

Temporal APIはMoment.jsやLuxonのようなライブラリを置き換えるものですか?

はい。日付や時刻の操作、解析、タイムゾーン管理のほとんどの主要な用途において、TemporalはMoment.js、Luxon、date-fnsといったライブラリのネイティブな代替となるよう設計されており、多くのプロジェクトでこれらの外部依存関係を不要にします。

Temporal APIはいつから使用できますか?

Temporalは2024年3月にStage 4に到達し、Chrome、Firefox、Edge、Node.js (v26+) の最新バージョンでデフォルトで利用可能です。Safariのサポートは現在進行中です。

Temporal APIはイミュータブル(不変)ですか?

はい、すべてのTemporalオブジェクトはイミュータブルです。1日を追加するなど、日付や時刻を変更する操作を行うと、新しいTemporalオブジェクトが返されるため、意図しない副作用を防ぎ、コードの予測可能性を高めることができます。

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only