Share
Embed
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
KazukiHayase
August 17, 2026
Transcript
23 slides
-
自己紹介 早瀬和輝 (Kazuki Hayase) @KazukiHayase SANU(2026/02~) Full-Stack TypeScript で開発 Next.js
/ GraphQL / Prisma 以前は Go を書いていた 最近の趣味は有名なドラマや映画を見ること -
導入 Temporal が Stage 4 に到達した 2026 年 3 月、TC39
第 113 回 plenary(ニューヨーク)にて This proposal is currently Stage 4. It will be merged into the ECMA-262 and ECMA-402 standards and this repository will be archived. Firefox 139 / Chrome 144 / Edge 144 / TypeScript 6.0 beta が対応済み SANU では 2023 年から本番で使用している https://github.com/tc39/proposal-temporal https://www.igalia.com/2026/03/13/Temporal-Reaches-Stage-4.html -
導入 Temporal とは Date Date を置き換えるために設計された新しい日時 API には、いくつか扱いにくいところがあった ミュータブル、 などが元のオブジェクトを書き換える
タイムゾーンがローカルと UTC しか扱えない 月が 0 始まり、非 ISO 文字列のパースは実装依存 setMonth() Temporal はイミュータブルで、用途ごとに型が分かれている PlainDate / PlainTime / PlainDateTime / ZonedDateTime / Instant ... -
導入 大小比較の手段が compare しかない 等価判定には があるが、大小比較は compare しかない 書くたびに「引数はどっちが先だっけ」「 で合ってるっけ」と考える
static メソッドなのでメソッドチェーンで書けない a.equals(b) > 0 https://github.com/js-temporal/proposal-temporal-v2/issues/6 https://github.com/tc39/proposal-temporal/issues/1086 -
導入 以前書いていた Go には Before / After があった Go の
には と 慣れていたのもあって、 time Compare Before / の両方がある と書けるのが読みやすかった After t.After(bedtime) Go JavaScript (Temporal) → なぜ Temporal には compare しかないのか気になって調べてみた -
日時の大小比較が compare しかない理由 - 理由1: 比較演算子は禁止された きっかけは 2020 年 4
月に報告された Issue #517 比較演算子はオブジェクトを valueOf() の戻り値に変換してから比較する 旧 で動いていたのは、 がエポックミリ秒を返していたから 当時の Temporal は を持たず、変換は にフォールバックしていた 結果として文字列の比較になり、負の年(紀元前)ではエラーも出ずに結果だけ間違う Date valueOf() valueOf() toString() → 演算子を「直す」か「禁止する」かの議論になった https://github.com/tc39/proposal-temporal/issues/517 -
日時の大小比較が compare しかない理由 - 理由1: 比較演算子は禁止された 直すのではなく、禁止することにした がエポックミリ秒を返すよう実装すれば、比較演算子は正しく動かせた ただしそれは、旧 と同じく暗黙の型変換に頼る設計に戻すことでもある
Temporal は日時を / / などの別々の型に分けている 強い型付けを優先し、 を throw させることに決定した 今は が TypeError になるので、間違った結果は返らない → 比較演算子で書く道は塞がれた valueOf() Date PlainDate PlainTime ZonedDateTime valueOf() d1 < d2 https://github.com/tc39/proposal-temporal/issues/517#issuecomment-622205366 https://github.com/tc39/proposal-temporal/issues/517#issuecomment-635504838 -
日時の大小比較が compare しかない理由 - 理由2: 専用メソッドは見送られた 実は提案されていた インスタンスメソッドを足す PR が、polyfill・テスト・spec
込みで出ていた 提案されていた形(PR #1074, 2020-10-29) Stage 4 で確定した現状 https://github.com/tc39/proposal-temporal/pull/1074 -
日時の大小比較が compare しかない理由 - 理由2: 専用メソッドは見送られた それでも Stage 3 レビューには入らなかった
命名を議論していた Issue #1086 の結論 We agreed that this proposal doesn't need to go into Stage 3 review, but we may consider it for the future, either post-Stage 3 review or in a V2 proposal. → 実装は揃っていたが、PR #1074 は merge されないまま close された(2021-02-12) https://github.com/tc39/proposal-temporal/issues/1086 -
日時の大小比較が compare しかない理由 - 理由2: 専用メソッドは見送られた Stage 4 に到達した proposal
には含まれなかった 入れなかった機能の判断基準は proposal-temporal-v2 の README に明記されている - Seemed useful, but not essential to the success of an already large proposal. - Could be implemented in userland in the meantime. - Could be implemented in the future in a web-compatible way. - Would be useful to see how (and whether) the community fills the feature gap before designing a built-in equivalent. 比較メソッドは他の機能に影響せず依存関係もないので、後から足しても何も壊れない → 却下ではなく先送り、こうして compare だけが残った https://github.com/js-temporal/proposal-temporal-v2 https://github.com/tc39/proposal-temporal/issues/1086 -
日時の大小比較が compare しかない理由 - 理由2: 専用メソッドは見送られた 小話: クラスごと削られた機能もある 2024 年、JS
エンジン実装者から proposal のスコープと複雑さを削るよう要請された サイズ影響への懸念から、 / はクラスごと削除された Temporal.TimeZone Temporal.Calendar the scope of Temporal was reduced at the request of JS engine implementers who were concerned about the size impact of adding Temporal to distributions on limited-capacity devices like low-end Android phones and Apple Watch. https://github.com/tc39/proposal-temporal/issues/2826 https://github.com/js-temporal/temporal-polyfill/blob/main/CHANGELOG.md -
日時の大小比較が compare しかない理由 - 理由3: 残った compare は sort のための形だった
sort() のコンパレータ兼用 が求めるコンパレータは という形 compare はそのまま sort() に渡せるように、この引数順と戻り値になっている Array.prototype.sort() (a, b) => number The Temporal.(type).compare() static methods have confusing parameter order, in order for them to be able to be used as the comparator function for Array.prototype.sort() . https://github.com/js-temporal/proposal-temporal-v2/issues/6 -
まとめ 現時点では、日時の大小比較は compare のみ Temporal は後から直せないものを優先し、後から足せるものは後回しにした / などの比較メソッドは、却下ではなく先送り API に何が「ない」かには理由がある、Issue
を読むと設計がわかる 🎉 lessThan greaterThan