LoginSignup
6
3

More than 5 years have passed since last update.

【DateTime】DateTime型を比較するためのcompareTo, isEqual, equalsの違い

Last updated at Posted at 2017-01-05

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

おわりに

何かご指摘やもっと良い方法等がありましたらコメントお願いします!

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3