バックエンド

【Java】isBefore, isAfter, compareToで日付を比較してみよう!【LocalDateTime】

date-comparison
野田竣介

今回はこのような質問をいただきました。

日付の比較ってイマイチわからない…

いろいろやり方あるけど、どれも少しわかりにくいんですよね。

そこで今回はこちらの質問について解説していきます!

日付を比較してみよう!

実際に今日と明日のLocalDateTimeを使って比較してみたいと思います。

こんな感じで定義してみました。

LocalDateTime now = LocalDateTime.now();
LocalDateTime tomorrow = now.plusDays(1);

isBefore, isAfter

isBefore, isAfterを使って比較してみます。

compareToよりも直感的でわかりやすい!

boolean before = now.isBefore(tomorrow);
boolean after = now.isAfter(tomorrow);
System.out.println("今日は明日の前?:" + before);
System.out.println("今日は明日の後?:" + after);
今日は明日の前?:true
今日は明日の後?:false

おまけ:同じ時間だったら?

どちらもnowを渡したらどうなるんだろう?

ということでやってみました。

boolean before = now.isBefore(now);
boolean after = now.isAfter(now);
System.out.println("今日は今日の前?:" + before);
System.out.println("今日は今日の後?:" + after);
今日は今日の前?:false
今日は今日の後?:false

isBeforeもisAfterも同じ時間は含まれないみたいですね。

でも実は同じ場合は普通に判定できちゃいます。

boolean result1 = now == now;
boolean result2 = now == tomorrow;
System.out.println("今日は今日?:" + result1);
System.out.println("今日は明日?:" + result2);
今日は今日?:true
今日は明日?:false

compareTo

少しわかりにくいけど、compareToも日付の比較に使えます。

System.out.println("今日 - 明日 = " + now.compareTo(tomorrow));
System.out.println("明日 - 今日 = " + tomorrow.compareTo(now));
System.out.println("今日 - 今日 = " + now.compareTo(now));
今日 - 明日 = -1
明日 - 今日 = 1
今日 - 今日 = 0

A.compareTo(B)の場合、AからBを引くイメージ。

その値がマイナスなら-1、プラスなら1、イコールなら0が返ります。

例文のようにイメージすると結構覚えやすいのかも?

おまけ:数値、文字列の比較

日付だけでなく、数値や文字列にも使えます!

Integer x = 1;
Integer y = 2;
System.out.println("x - y = " + x.compareTo(y));
System.out.println("y - x = " + y.compareTo(x));
System.out.println("x - x = " + x.compareTo(x));
String a = "a";
String b = "b";
System.out.println("a - b = " + a.compareTo(b));
System.out.println("b - a = " + b.compareTo(a));
System.out.println("a - a = " + a.compareTo(a));
x - y = -1
y - x = 1
x - x = 0
a - b = -1
b - a = 1
a - a = 0

まとめ

isBefore, isAfterを使う場合はこんな感じ。

boolean before = now.isBefore(tomorrow);
boolean after = now.isAfter(tomorrow);
System.out.println("今日は明日の前?:" + before);
System.out.println("今日は明日の後?:" + after);

compareToを使う場合はこんな感じ。

System.out.println("今日 - 明日 = " + now.compareTo(tomorrow));
System.out.println("明日 - 今日 = " + tomorrow.compareTo(now));
System.out.println("今日 - 今日 = " + now.compareTo(now));

使いやすいほうを使えば良いと思いますが、プロジェクト内では統一しておきたいですね!

あとがき

compareToはわかりにくいと思っていたけど、そんなことはなかった。

ただの引き算だと思って使えば簡単ですね。

isBefore, isAfterは例文のように英語を翻訳するイメージで覚えました。

A.isBefore(B) → A is before B → AはBの前です

日付を比較する場面は多いと思うので覚えておきたいですね!

記事URLをコピーしました