バックエンド

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

date-comparison

こんばんは!光です。

大手グローバル企業でWebエンジニアをやっています。

Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。

経歴や実績はこちら

システム開発のお仕事の依頼もお待ちしております。

お問い合わせページTwitterのDMからお気軽にお問い合わせください!

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

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

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

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

日付を比較してみよう!

実際に今日と明日の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の前?

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