TL;DR
リソースが公開状態かどうかを判定するために、SQLのカラムにopenTime,closeTime等を設けていて、isOpenedみたいな判定をしたい。
そこでcompareToを使ってみたが、isBefore等を使っているケースもあり、このあたりのそれぞれの使い方や違いなどを少し調べてみたのでメモ。
compareTo,isEqual,equalsはそれぞれ戻り値とTimeZoneの扱いにおいて違いがあるため、必要に応じて適切に使う必要がある。
isEqual (isAfter, isBefore)
A.isEqual(B) -> true : AとBは同じ
A.isAfter(B) -> true : AはBより未来
A.isBefore(B) -> true : AはBより過去
DateTime.isHogehogeを使った場合のisOpenedな判定は以下のようになる
(now.isEqual(openTime) || now.isAfter(openTime)) && now.isBefore(closeTime)
isAfter,isBeforeは一致の際にfalseなため、isEqualと組み合わせて使う必要がある。
また、DateTime.isHogehogeはTimeZoneを考慮しないことにも注意。
A:DateTime = 2017-01-05T15:00Z
B:DateTime = 2017-01-05T15:00+09:00
のとき
A.isEqual(B) // true
compareTo
A.compareTo(B) -> -1 : AはBより過去
A.compareTo(B) -> 0 : AとBは同じ
A.compareTo(B) -> 1 : AはBより未来
compareToを使った場合のisOpenedな判定は以下のようになる
now.compareTo(openTime) >= 0 && now.compareTo(closeTime) < 0
こっちのほうがシンプルでいいように感じる。
また、DateTime.isHogehogeはTimeZoneを考慮しないことにも注意。
A:DateTime = 2017-01-05T15:00Z
B:DateTime = 2017-01-05T15:00+09:00
のとき
A.compareTo(B) // 0
equals
A.equals(B) -> true : AとBは同じ
この3つの中で、唯一このequalsがTimeZoneを考慮する
A:DateTime = 2017-01-05T15:00Z
B:DateTime = 2017-01-05T15:00+09:00
のとき
A.equals(B) // false
おわりに
何かご指摘やもっと良い方法等がありましたらコメントお願いします!