🕰️

Cookbookを見てTemporalの具体的な使い方を知る

2024/06/08に公開

JavaScriptのDateは、

  • inputが不正な文字列であっても、parseの時にエラーを吐かない
  • ユーザーのタイムゾーンとUTC以外にタイムゾーンをサポートしていない
  • (少し細かい話だが)なぜかmonthが0から始まる

など、JavaScriptを書く人間にとってやや警戒される対象となっており、それ故に日付周りの処理を書く際はdayjsやdate-fnsなどのライブラリを頼るケースが多い気がします。

このDateの既存の問題点、および使用状況を受けて、新しい日付管理のAPIとしてtc39のプロポーザルに上がっているのがTemporalです。

こちらはMaggie Pintによる、Dateの既存の問題点やTemporalを策定することへのモチベーションを語った記事です。
https://maggiepint.com/2017/04/09/fixing-javascript-date-getting-started/

Temporalの公式リポジトリには、日本語用のディレクトリが生えています。こちらはReadMeです。
https://github.com/tc39/proposal-temporal/blob/main/docs/ja/README.md

ReadMeを見ると要領はつかめるのですが、もう少し具体的なシチュエーションも知りたかったので、同じく公式ディレクトリにあったCookBookのレシピをいくつか見ていきます。

月末の日付が自動で調節される

2020/5/31の月部分を2月に変えると自動で2020/2/29になります。

月によって最終の日付は異なることを把握しており、そこをスマートに調整してくれるということです。これはDateにはない機能です。
また、withメソッドでTemporalインスタンスの一部を変更することができます。

https://github.com/tc39/proposal-temporal/blob/main/docs/cookbook/adjustMonth.mjs

タイムゾーンを自由に設定する

Temporal.ZonedDateTimeで、タイムゾーンをアメリカのシカゴに設定しています。
その後、withTimeZoneでロサンゼルスに変更しています。
シンプルな例ですが、これをシンプルに実現できるのがTemporalの長所なのでしょう。

https://github.com/tc39/proposal-temporal/blob/main/docs/cookbook/zonedDateTimeInOtherZone.mjs

月初めの火曜日を取得する

受け取った月のデータから、1日(ついたち)のデータを作成し、1日の曜日に基づいて月初めの火曜日を算出しています。

add({ days: [1, 0, 6, 5, 4, 3, 2][firstOfMonth.dayOfWeek - 1] })という書き方がおもしろいですね。
数値の配列は左から月曜、火曜、水曜...と対応しています。

たとえばfirstOfMonth.dayOfWeekの曜日が木曜ならば、次の火曜が来るまで5日かかるわけなので、1日に5日を足し合わせて、6日が月初めの火曜であることが算出される。
もしくはfirstOfMonth.dayOfWeekの曜日が火曜ならば、ジャストなので1日 + 0日で1日が算出される、というロジックです。

https://github.com/tc39/proposal-temporal/blob/main/docs/cookbook/getFirstTuesdayOfMonth.mjs

前回の記録を迎える1分前にアラートする

なにかしらのレースがあると仮定して、レースの開始時刻を設定し、前回の記録の1分前になったらアラートを送るような仕組みを作っています。
「レースの開始時刻」はTemporal.Instant、「前回の記録」はTemporal.Duration、「1分」はTemporal.Durationで作成しています。

https://github.com/tc39/proposal-temporal/blob/main/docs/cookbook/getInstantBeforeOldRecord.mjs

さまざまなタイムゾーンで開催されるイベントの時刻を、ローカルのタイムゾーンで算出する

tc39のミーティングをテーマとしたレシピです。
America/Phoenix, America/New_York, Europe/Berlin, America/Los_Angelesで開催されるグローバルな未来のイベントの時刻を、東京のタイムゾーンとして時刻を算出し直しています。

https://github.com/tc39/proposal-temporal/blob/main/docs/cookbook/localTimeForFutureEvents.mjs

感想

Temporalはいつ標準化されるのだろう。
待ち遠しいが、会社の時刻管理はdayjsだから、置き換え大変そうでもある。。

Discussion