Temporal study
https://web-study.connpass.com/event/383606/
ふぁぼんさん
temporal-polyfill-lite
https://github.com/fabon-f/temporal-polyfill-lite
古いブラウザにも対応するために、BigIntを使わずに実装
グレゴリオ暦でしか使わないバージョンと、フルサポートバージョンの2つがある
Date
ミュータブル
月が0-indexed
UTCとローカル時間の2つしかタイムゾーンを扱えない
文字列のパース
https://jsdate.wtf/
Moment.js
タイムゾーンを扱えるようになったけどバンドルサイズがでかい
Intl.DateTimeFormat/toLocaleString
フォーマットは環境によって異なる
処理が遅い
Temporal
Moment.jsのメンテナーの1人が発案
異なるセマンティクスを異なる型で表現
提案からstage4までに9年
仕様書が1.2万行以上
テストケースは6500ファイル以上
stage3になってから実装者のフィードバックで仕様が大幅に削られた
タイムゾーン
IANAのタイムゾーンDB
CanonicalなタイムゾーンIDはどれか
どの同一タイムゾーンIDを同一とみなすかは、CLDRに準拠
違う国で同一タイムゾーンとして扱っているものは、将来的に別のタイムゾーンを使うことにした場合におかしくなってしまう
暦
ルールベースではない暦
中国と韓国の旧暦、イランのヒジュラ太陽暦など
日本の元号はどこまで遡るべきか
質問
バックエンドがJS以外だったら?
タイムゾーンはまともなプログラミング言語は割とある
今回のTemporalで正しいデータが得られたのは大きいので、他のプログラミング言語でもこれを参照できるようになった
令和に変わったときの話
すぐにアップデートできるかどうか
DBが更新されればアップデートできる
ハードコードしている場合は、hotfixで入れることになりそう
Sajiさん
「日時」にも種類がある
WallClockTime
特定のロケール・暦における表現
何年何月何日とか
ExactTime
世界共通の、ある一瞬
Unix Epochとか
この2つの変換には、タイムゾーンのデータが必要
日時は「ある一瞬」ではなく、点だったり期間だったりする
TemporalはWallClockTimeとExactTimeを厳密に区別する
WallClockTime: Temporal.PlainXX
XXはDateTime、Dateなど
インスタンスによってできる操作が違う
ExactTime: Temporal.Instant
Temporal.ZonedDateTimeで変換できる
特定の一瞬でないもの
文字列(yyyy-MM-ddなど)で保存して、PlainDate.fromで復元するとか
計算メソッドはあまりない
isWeekend 、isSameDayなどはない
add, subtract, since, untilなどはある
formatはIntlを使っている
format patternはない
新しくJSを学ぶ人に最初からTemporalを教えるべきか?
思い出したのでメモ
https://github.com/adobe/react-spectrum/tree/main/packages/%40internationalized/date