SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaScriptの「今」はこうなっている!現場のコードを変える注目機能を総ざらい

さらばDate、ようこそTemporal。JavaScriptの日時処理にどう向き合うか

JavaScriptの「今」はこうなっている!現場のコードを変える注目機能を総ざらい 第1回

ダウンロード サンプリング (2.4 KB)

 JavaScriptで日時情報といえばDateと決まっていました。しかしながら、このDateはさまざまな問題を抱えていました。これがTemporalの標準化で大きく変わります。Dateを使い続けるプロジェクトは、大きな負債を抱えることになるかもしれません。今回は、Dateの抱える問題点を改めて浮き彫りにしてTemporalのアプローチを評価することで、日時処理にどう向き合うべきかの指針を示します。

はじめに

 JavaScriptは絶え間ない進化を続けています。これを追いかけていくと、多数の便利な追加や改善の中に、従来のコードが時代遅れになるような、コードの書き方が変わるほどのインパクトある機能を見つけることができます。本連載は、JavaScriptを普段使いする開発者に向けて、JavaScriptの標準規格である「ECMAScript」で標準化された、あるいは標準化予定の機能を紹介しながら、開発者が自身のコードをどうアップデートすべきか解説します。

対象読者

  • JavaScriptの最新バージョンの機能を把握したい方
  • JavaScriptの経験者で、JavaScriptに改めて入門したい方
  • プログラミング言語の最新パラダイムに関心のある方

必要な環境

 本記事のサンプルコードは、以下の環境で動作を確認しています。他の環境では動作しないか、動作が不安定になる可能性があります。

  • macOS Sequoia
    • Node.js 26.3

Dateに替わる新進の標準API、Temporalとは?

 本項のテーマであるTemporalは、Dateに替わる新たな日時表現・操作のためのAPIです(Temporalとは「時の」といった意味です)。

 JavaScriptにおける日時表現・操作のためのAPIとしては、Dateが長らく使われてきました。しかし、このDateはその出自から問題を抱えているため、開発者にさまざまな対応策を強いてきた、ある種の「困りもの」でした。具体的にどのような問題があったかについては後述しますが、Dateの問題点を解決し、整理整頓して一新したのがTemporalです。

 Temporalは、2017年に最初のProposalが投稿され、標準化が進められてきました。このTemporalは本稿作成時点でStage 4に達し、来たるECMAScript 2027の標準機能として追加される予定です。5月にはついにNode 26にも実装されるなど、本記事の執筆時点ではSafariを除く主要なPCブラウザおよびJSエンジンでは問題なく使える状況となっています。

 このため、W3C WebDX Community Groupのコミュニティ活動として策定される指標では、Limited Availability(一部のプラットフォームで動作しない)という扱いになっています。

Temporalのクラスは極めて整理されている

 Temporalは名前空間であり、その配下に用途に応じたたくさんのクラスが配置されます。その主なものを以下の表に挙げます。

表:Temporal配下の主なクラス
クラス 用途
Instant タイムゾーンのない、絶対的な「特定の瞬間」
ZonedDateTime タイムゾーンと暦情報を含んだ、最も包括的な日時データ
PlainDateTime タイムゾーンを持たない、カレンダー上の「日付と時刻」の情報
PlainDate 時刻情報を持たない「日付のみ」の情報
PlainTime 日付情報を持たない「時刻のみ」の情報
PlainYearMonth 「年月」のみの情報
PlainMonthDay 「月日」のみの情報
Duration 2つの時点の間の「期間・時間差」
Now 現在の時刻や日付を各形式で取得するためのユーティリティー空間

 このように、たくさんのクラスがあるので関係が分かりにくいかも知れません。そこで、以下の図を用意しました。

図:Temporalのクラス群を整理してみた
図:Temporalのクラス群を整理してみた

 InstantとZonedDateTimeはExact Time(正確な時間)と呼ばれ、ある瞬間を表す日時データに相当します。InstantがUnixエポック(UTCにおける1970年1月1日午前0時0分0秒)からの経過時間としてのタイムスタンプ情報、ZonedDateTimeが日時とタイムゾーンのペアで、それぞれ日時を表します。ちなみにInstantとは、まさに「一瞬」を意味し、その瞬間瞬間を表す概念です。

 これに対してPlainで始まるクラスはWall-Clock Time(壁掛け時計の時間)と呼ばれ、タイムゾーンを持たずに日時を単純に表すデータに相当します。壁掛け時計なので、日時の表現に徹するわけです。タイムゾーンとは関係なく、日付や時間の表現が欲しい場合に使うクラスです。

 ところで、Exact TimeとWall-Clock Timeが分けられているのはなぜでしょうか? これは、Dateオブジェクトが抱えていた、「タイムゾーンや夏時間(DST)の扱いでバグを生み出しやすい」という設計ミスを根本から解決するためです。

 たとえば、海外の複数の拠点間でオンライン会議を開催するとします。「2026年6月2日の午前6時に開催」という場合、Wall-Clock Timeだけでは拠点のタイムゾーンごとに複数の「2026年6月2日の午前6時」が発生してしまいます。これに夏時間の切り替えが絡めば、さらに日時の候補が増えてしまいます。これに対してExact Timeでは、Unixエポックからの経過時間で日時を表現するので、世界中のどの場所でも「唯一の正しい瞬間」を取り扱うことができます。

 具体的には、以下のアプローチがとられます。

  1. 絶対的な時間と人間の都合による時間を明確に分ける
  2. 夏時間による「存在しない時間」や「重複する時間」を安全に扱う
  3. 従来のDateオブジェクトの失敗(Exact TimeとWall-Clock Timeがごっちゃ)を繰り返さない

 いずれも、タイムゾーンや夏時間を考慮した計算では必須のアプローチといえます。

インスタンス生成の方法はいくつもある

 Temporalにおいて、インスタンス生成の方法はいくつもあり、目的や利便性に応じて使い分けられます。

  1. 現在日時から生成(Now)
  2. コンストラクタで生成
  3. 日時オブジェクトから生成(fromメソッド)
  4. 日時文字列から生成(fromメソッド)

 ここではまず、Nowを使って、現在日時をさまざまな形式で取得してみます。以下のリストは、現在日時をInstant、タイムゾーン付き日時、タイムゾーンなし日時/日付/時間の形式で取得する例です。

リスト temporal_now.js
// Instantを生成
const instant = Temporal.Now.instant();
console.log(instant.toString());
	// 2026-06-08T02:31:45.025769043Z
// ZonedDateTimeを生成
const zdt = Temporal.Now.zonedDateTimeISO(); 
console.log(zdt.toString());
	// 2026-06-08T11:31:45.042727051+09:00[Asia/Tokyo]
// PlainDateTimeを生成
const dt = Temporal.Now.plainDateTimeISO();
console.log(dt.toString());	// 2026-06-08T11:31:45.04475
// PlainDateを生成
const date = Temporal.Now.plainDateISO();
console.log(date.toString());	// 2026-06-08
// PlainTimeを生成
const time = Temporal.Now.plainTimeISO();
console.log(time.toString());	// 11:31:45.045188965

 その他の生成方法については、Temporalの機能を紹介していく過程で、随時取り上げていきます。

 なお詳しくは後述しますが、Temporalではさまざまな暦に対応しています。既定はグレゴリオ暦を基本としたISO 8601で、「ISO」の付いたメソッドはこれに基づき動作します。

 ところで、Temporalは単独のクラスではなく、多くのクラスを傘下に収める名前空間です。これほどのクラスを用意しなければならない背景とは何だったのでしょうか。以降で、Dateの抱える問題点を露わにしながら、Temporalがそれをどのように解決してきたかを掘り下げていきましょう。

次のページ
Dateの何が悪かったのか?

この記事は参考になりましたか?

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/28910 2026/07/23 08:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー