Cookbookを見てTemporalの具体的な使い方を知る
JavaScriptのDateは、
- inputが不正な文字列であっても、parseの時にエラーを吐かない
- ユーザーのタイムゾーンとUTC以外にタイムゾーンをサポートしていない
- (少し細かい話だが)なぜかmonthが0から始まる
など、JavaScriptを書く人間にとってやや警戒される対象となっており、それ故に日付周りの処理を書く際はdayjsやdate-fnsなどのライブラリを頼るケースが多い気がします。
このDateの既存の問題点、および使用状況を受けて、新しい日付管理のAPIとしてtc39のプロポーザルに上がっているのがTemporalです。
こちらはMaggie Pintによる、Dateの既存の問題点やTemporalを策定することへのモチベーションを語った記事です。
Temporalの公式リポジトリには、日本語用のディレクトリが生えています。こちらはReadMeです。
ReadMeを見ると要領はつかめるのですが、もう少し具体的なシチュエーションも知りたかったので、同じく公式ディレクトリにあったCookBookのレシピをいくつか見ていきます。
月末の日付が自動で調節される
2020/5/31の月部分を2月に変えると自動で2020/2/29になります。
月によって最終の日付は異なることを把握しており、そこをスマートに調整してくれるということです。これはDateにはない機能です。
また、withメソッドでTemporalインスタンスの一部を変更することができます。
タイムゾーンを自由に設定する
Temporal.ZonedDateTimeで、タイムゾーンをアメリカのシカゴに設定しています。
その後、withTimeZoneでロサンゼルスに変更しています。
シンプルな例ですが、これをシンプルに実現できるのがTemporalの長所なのでしょう。
月初めの火曜日を取得する
受け取った月のデータから、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日が算出される、というロジックです。
前回の記録を迎える1分前にアラートする
なにかしらのレースがあると仮定して、レースの開始時刻を設定し、前回の記録の1分前になったらアラートを送るような仕組みを作っています。
「レースの開始時刻」はTemporal.Instant、「前回の記録」はTemporal.Duration、「1分」はTemporal.Durationで作成しています。
さまざまなタイムゾーンで開催されるイベントの時刻を、ローカルのタイムゾーンで算出する
tc39のミーティングをテーマとしたレシピです。
America/Phoenix, America/New_York, Europe/Berlin, America/Los_Angelesで開催されるグローバルな未来のイベントの時刻を、東京のタイムゾーンとして時刻を算出し直しています。
感想
Temporalはいつ標準化されるのだろう。
待ち遠しいが、会社の時刻管理はdayjsだから、置き換え大変そうでもある。。
Discussion