require 'date'
DateTime.new(2018, 3, 1, 12, 30, 15) == DateTime.new(2018, 3, 1, 20, 30, 15)
=> false
DateTime.new(2018, 3, 1, 12, 30, 15) === DateTime.new(2018, 3, 1, 20, 30, 15)
=> true
DateTime.new(2018, 3, 1, 12, 30, 15) === DateTime.new(2018, 3, 2, 12, 30, 15)
=> false
このような挙動をする原因について解説します。
まず、DateTimeクラスのリファレンスをみてみましょう。
このクラスには===
の実装はありません。
親クラスであるDateクラスには===
の実装があり"同じ日なら真を返します。"と書いてあります。
ということはDateTime
の===
はDate
の===
を実行しており日時ではなく日の比較しかしていないことがわかります。
よって日付は同じで時間だけがずれている場合はtrue
を返し、日付が変わるとfalse
を返すという挙動になります。
ちなみに、ここのコードにぶち当たったのが原因で調べました。
追記
rubyのソースコードにも書いてありました。