Java 日時比較の書き方

Javaの LocalDateTime, LocalDate など、
日時比較の書き方についてまとめてみました。

毎回混乱する人も多いかと思うので、参考になれば幸いです。

日時比較の方法

Javaで日時比較をする場合、下記のメソッドを使う方法があります。

isBefore / isAfter / isEqual メソッド

メソッドの主語にあたるオブジェクトが、before(前)なのか、after(後)なのかを返すメソッドです。
(英語の文法のまま読むとOKです)

// a < b の関係のときにtrue
a.isBefore(b);

// a > b の関係のときにtrue
a.isAfter(b);

// a == b の関係のときにtrue
a.isEqual(b);

多くの場合、このメソッドで充分ですが、
同値と組み合わせた場合のメソッドは用意されていないので、
同値を含めたい場合は、isEqualと組み合わせて表現することになります。

compareTo メソッド

日時だけでなく、Integerや、他のクラスにも用意されている比較用のメソッドです。

// a < b の関係ならtrue
a.compareTo(b) < 0;

// a == b の関係ならtrue
a.compareTo(b) == 0;

// a > b の関係ならtrue
a.compareTo(b) > 0;

compareToメソッドは、

  • a < b の関係であれば、-1を返す。
  • a == b の関係であれば、0を返す。
  • a > b の関係であれば、1を返す。

といった具合に値を返します。

その特性を利用して上記の様に、右辺にゼロをおくことで、aとbの関係を表す不等式で記述することができます。

compareToを利用した場合、同値を含む場合もそのまま表現することができます。

// a <= b の関係ならtrue
a.compareTo(b) <= 0;

// a >= b の関係ならtrue
a.compareTo(b) >= 0;

各比較パターン

各比較パターンをそれぞれの方法でどう書けば良いのか、下記に列挙してみました。

a == b

a.compareTo(b) == 0;

a.isEqual(b);

a < b

a.compareTo(b) < 0;

a.isBefore(b);

a > b

a.compareTo(b) > 0;

a.isAfter(b);

a ≤ b

a.compareTo(b) <= 0;

a.isEqual(b) || a.isBefore(b);

!a.isAfter(b); // !(a > b)

a ≥ b

a.compareTo(b) >= 0;

a.isEqual(b) || a.isAfter(b);

!a.isBefore(b); // !(a < b)

まとめ

LocalDateTimeなどのクラスには、isBefore, isAfter, isEqual メソッドが用意されていますが、
最終的には、compareTo の書き方を使うほうが、あらゆるケースで直感的に記述することができます。

右辺にゼロをおく、compareToの書き方を覚えておくと直感的に記述ができるので覚えておくと良いでしょう。

コメントを残す