Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜ Temporal の大小比較には compare しかないのか / Why Does T...

なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons

Avatar for KazukiHayase

KazukiHayase

August 17, 2026

More Decks by KazukiHayase

Other Decks in Technology

Transcript

  1. 自己紹介 早瀬和輝 (Kazuki Hayase) @KazukiHayase SANU(2026/02~) Full-Stack TypeScript で開発 Next.js

    / GraphQL / Prisma 以前は Go を書いていた 最近の趣味は有名なドラマや映画を見ること
  2. 導入 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
  3. 導入 Temporal とは Date Date を置き換えるために設計された新しい日時 API には、いくつか扱いにくいところがあった ミュータブル、 などが元のオブジェクトを書き換える

    タイムゾーンがローカルと UTC しか扱えない 月が 0 始まり、非 ISO 文字列のパースは実装依存 setMonth() Temporal はイミュータブルで、用途ごとに型が分かれている PlainDate / PlainTime / PlainDateTime / ZonedDateTime / Instant ...
  4. 導入 大小比較の手段が 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
  5. 導入 以前書いていた Go には Before / After があった Go の

    には と 慣れていたのもあって、 time Compare Before / の両方がある と書けるのが読みやすかった After t.After(bedtime) Go JavaScript (Temporal) → なぜ Temporal には compare しかないのか気になって調べてみた
  6. 日時の大小比較が compare しかない理由 - 理由1: 比較演算子は禁止された きっかけは 2020 年 4

    月に報告された Issue #517 比較演算子はオブジェクトを valueOf() の戻り値に変換してから比較する 旧 で動いていたのは、 がエポックミリ秒を返していたから 当時の Temporal は を持たず、変換は にフォールバックしていた 結果として文字列の比較になり、負の年(紀元前)ではエラーも出ずに結果だけ間違う Date valueOf() valueOf() toString() → 演算子を「直す」か「禁止する」かの議論になった https://github.com/tc39/proposal-temporal/issues/517
  7. 日時の大小比較が 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
  8. 日時の大小比較が compare しかない理由 - 理由2: 専用メソッドは見送られた 実は提案されていた インスタンスメソッドを足す PR が、polyfill・テスト・spec

    込みで出ていた 提案されていた形(PR #1074, 2020-10-29) Stage 4 で確定した現状 https://github.com/tc39/proposal-temporal/pull/1074
  9. 日時の大小比較が 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
  10. 日時の大小比較が 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
  11. 日時の大小比較が 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
  12. 日時の大小比較が 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