Javaで日付を比較する方法(Dateクラス、Calendarクラスの使い方)
初心者向けにJavaで日付を比較する方法について解説しています。ここではDateクラスとCalendarクラスを使った比較方法を解説します。日付が等しい・過去・未来といったそれぞれの場合についてサンプルを参照しながら確認しましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
この記事では、Javaで日付を比較する方法について解説します。
【注意事項】
Java8からは「Date-Time API」という、日時をより便利に扱えるクラス群が用意されています。Java8以上のバージョンをご利用で興味がある方は調べてみてください。
実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。
そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。
今回は、Javaに関する内容だね!
どういう内容でしょうか?
日付を比較する方法について詳しく説明していくね!
お願いします!
日付を比較する方法
Java標準APIの「java.util」パッケージには、日時を表すクラス「Date」「Calendar」が用意されています。
ここでは「Date」クラス、「Calendar」クラスを使って日付(日時の「日」の部分)を比較する方法をご紹介します。
比較するメソッドは「Date」クラスに用意されています。
日付が等しいか
public boolean equals(Object obj)
ふたつの日付が等しいかどうかを比較し、等しい場合はtrueを返します。
日付が過去であるか
public boolean before(Date when)
この日付が、指定された日付「when」より前(過去)であるかどうかを判定し、過去の場合はtrueを返します。
日付が未来であるか
public boolean after(Date when)
この日付が、指定された日付「when」より後(未来)であるかどうかを判定し、未来の場合はtrueを返します。
実際に書いてみよう
ふたつの日付を比較する処理を書いてみましょう。
日付を比較するクラス
import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class DateComparator { public static boolean before(Date a, Date b) { Date compA = truncate(a); Date compB = truncate(b); return compA.before(compB); } public static boolean after(Date a, Date b) { Date compA = truncate(a); Date compB = truncate(b); return compA.after(compB); } public static boolean equals(Date a, Date b) { Date compA = truncate(a); Date compB = truncate(b); return compA.equals(compB); } /** * 日時の「時刻」を切り捨てる * @param datetime 日時 * @return 時刻を切り捨てた日付 */ public static Date truncate(Date datetime) { Calendar cal = Calendar.getInstance(); cal.setTime(datetime); return new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)) .getTime(); } }
プログラム実行クラス
import java.util.Calendar; import java.util.Date; public class Application { public static void main(String[] args) throws Exception { Date a; Date b; // 2つの日付を比較する a = toDate(2018, 1, 10); b = toDate(2018, 1, 11); compare(a, b); a = toDate(2020, 1, 10); b = toDate(2018, 1, 11); compare(a, b); a = toDate(2018, 12, 31); b = toDate(2018, 12, 31); compare(a, b); } static void compare(Date a, Date b) { System.out.printf("[a = %s, b = %s]%n", a, b); System.out.println("aはbより過去:" + DateComparator.before(a, b)); System.out.println("aはbより未来:" + DateComparator.after(a, b)); System.out.println("aはbと等しい:" + DateComparator.equals(a, b)); System.out.println(); } static Date toDate(int year, int month, int day) throws InterruptedException { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month - 1); cal.set(Calendar.DATE, day); // 時刻をずらすための措置 Thread.sleep(500); return cal.getTime(); } }
実行結果
実行すると以下のような結果となるでしょう。
正しく日付の比較ができているようですね。
[a = Wed Jan 10 21:27:23 JST 2018, b = Thu Jan 11 21:27:24 JST 2018] aはbより過去:true aはbより未来:false aはbと等しい:false [a = Fri Jan 10 21:27:24 JST 2020, b = Thu Jan 11 21:27:25 JST 2018] aはbより過去:false aはbより未来:true aはbと等しい:false [a = Mon Dec 31 21:27:25 JST 2018, b = Mon Dec 31 21:27:26 JST 2018] aはbより過去:false aはbより未来:false aはbと等しい:true
ここでは、時刻を無視して日付部分だけで比較を行えるよう、「DateComparator」クラスの「truncate」メソッドで時刻を切り捨てる工夫をしています。
時刻も含めた「日時」で比較したい場合はこういった処理は必要ありません。
監修してくれたメンター
青柳哲夫
独立系SIerやベンチャーを経て、現在はフリーランスエンジニアとして活動しています。 |
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。