hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

DateとTimeの比較

たまたま、DateとTimeを意図せず比較している処理があったので調べてみた。 Date同士の比較であれば日付があっていれば 等しくなるので当たり前だけど

Date.new(2023, 1, 1) == Date.new(2023, 1, 1) # true

これが片方が Timeの場合

Date.new(2023, 1, 1) == Time.local(2023, 1, 1) # false

一致しないのだけど これはRailsirbで比較しているので zone が設定されていて

Time.local(2023, 1, 1) # 2023-01-01 00:00:00 +0900

になっている。 なので 同一であるためには Tokyoの場合は9時間ずれているので 9時で比較すると 同等とされる

Date.new(2023, 1, 1) == Time.local(2023, 1, 1, 9) # true

そして9時を境に大小比較されるので

Date.new(2023, 1, 1) < Time.local(2023, 1, 1, 10) # true
Date.new(2023, 1, 1) > Time.local(2023, 1, 1, 8) # true

日付だけを考えるとバグを埋め込んでしまう。 全然わかってなかったけどこういう挙動なんだという気づき。