【Java】before/after/compareTo/equalsを使って日付を比較する!
日付を比較するにはbeforeやafter、compareTo、equalsメソッドを使用します。
日付は比較して、どちらが先かどうかを判定することができます。
例えば、美容院の予約などで1日前までは予約キャンセルができますが、当日にはキャンセルができなくなり、「電話で問い合わせてください。」という画面が表示されたことがあるかと思います。
その機能にも日付の比較が使用されています。
今回は以下の場合で日付の比較を行います。
・ beforeメソッドで日付の比較を行う場合
・ afterメソッドで日付の比較を行う場合
・ compareToメソッドで日付の比較を行う場合
・ equalsメソッドで日付の比較を行う場合
目次
beforeメソッドとは
Dateクラスのbeforeメソッドは指定した日付より前にあるかどうかを判定します。
beforeメソッドの書き方
beforeメソッドの構文は下記となります。
1 |
date値1.before(date値2) |
beforeのにdate値2を指定することでdate値1とdate値2の値を比較します。
date値1が、date値2よりも日付が前である場合は「true」を、そうでない場合は「false」を返します。
afterメソッドとは
Dateクラスのafterメソッドは、指定した日付より後にあるかどうかを判定します。
afterメソッドの書き方
afterメソッドの構文は下記となります。
1 |
date値1.after(date値2) |
afterの()にdate値2を指定することでdate値1とdate値2の値を比較します。
date値1が、date値2よりも日付が後である場合は「true」を、そうでない場合は「false」を返します。
compareToメソッドとは
DateクラスでのcompareToメソッドは日付の比較を行うことができます。
compareToメソッドの書き方
compareToメソッドの構文は下記となります。
1 |
date値1.compareTo(date値2) |
()の引数にdate値2を指定することで、date値1とdateの値2を比較するようになります。
比較した場合、一致する場合は「0」を、異なる場合は「0以外」を返します。
equalsメソッドとは
Dateクラスでのequalsメソッドは、日付の比較を行うことができます。
equalsメソッドの書き方
equalsメソッドの構文は下記となります。
1 |
date値1.equals(date値2) |
()の引数のdate値2を指定することで、date値1とdate値2を比較するようになります。
比較した場合、date値1とdate値2が一致するならtrue、違うならfalseを返します。
日付を比較するサンプルコード
日付を比較するサンプルコードを紹介します。
beforeを使用した場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 日付を比する import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd"); // 比較元 Date org = sdf.parse("2020/04/02"); System.out.println("比較元: 2020/04/02"); System.out.println(); // 比較対象 Date d1 = sdf.parse("2020/04/01"); Date d2 = sdf.parse("2020/04/02"); Date d3 = sdf.parse("2020/04/03"); // 対象は未来か System.out.println("beforeメソッド"); System.out.println("2020/04/01:" + org.before(d1)); System.out.println("2020/04/02:" + org.before(d2)); System.out.println("2020/04/03:" + org.before(d3)); } } |
出力結果
比較元: 2020/04/02
beforeメソッド
2020/04/01:false
2020/04/02:false
2020/04/03:true
beforeの()の引数の値が2020/04/02よりも後の日付である場合はtrueを返し、2020/04/02よりも前の日付である場合はfalseを返しています。
afterを使用した場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 日付を比する import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd"); // 比較元 Date org = sdf.parse("2020/04/02"); System.out.println("比較元: 2020/04/02"); System.out.println(); // 比較対象 Date d1 = sdf.parse("2020/04/01"); Date d2 = sdf.parse("2020/04/02"); Date d3 = sdf.parse("2020/04/03"); // 対象は過去か System.out.println("afterメソッド"); System.out.println("2020/04/01:" + org.after(d1)); System.out.println("2020/04/02:" + org.after(d2)); System.out.println("2020/04/03:" + org.after(d3)); } } |
出力結果
比較元: 2020/04/02
afterメソッド
2020/04/01:true
2020/04/02:false
2020/04/03:false
afterの()の引数の値が2020/04/02よりも前の日付である場合はtrueを返し、2020/04/02よりも後の日付である場合はfalseを返しています。
compareToを使用した場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// 日付を比する import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd"); // 比較元 Date org = sdf.parse("2020/04/02"); System.out.println("比較元: 2020/04/02"); System.out.println(); // 比較対象 Date d1 = sdf.parse("2020/04/01"); Date d2 = sdf.parse("2020/04/02"); Date d3 = sdf.parse("2020/04/03"); // compareToによる比較 System.out.println("compareToメソッド"); System.out.println("2020/04/01:" + org.compareTo(d1)); System.out.println("2020/04/02:" + org.compareTo(d2)); System.out.println("2020/04/03:" + org.compareTo(d3)); System.out.println(); } } |
出力結果
比較元: 2020/04/02
compareToメソッド
2020/04/01:1
2020/04/02:0
2020/04/03:-1
compareToの()の引数の値が2020/04/02と同じである場合は「0」を、そうでない場合は、日数の差の値を返しています、。
equalsを使用した場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 日付を比する import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd"); // 比較元 Date org = sdf.parse("2020/04/02"); System.out.println("比較元: 2020/04/02"); System.out.println(); // 比較対象 Date d1 = sdf.parse("2020/04/01"); Date d2 = sdf.parse("2020/04/02"); Date d3 = sdf.parse("2020/04/03"); // 対象と等しいかどうか System.out.println("equalsメソッド"); System.out.println("2020/04/01:" + org.equals(d1)); System.out.println("2020/04/02:" + org.equals(d2)); System.out.println("2020/04/03:" + org.equals(d3)); } } |
出力結果
比較元: 2020/04/02
equalsメソッド
2020/04/01:false
2020/04/02:true
2020/04/03:false
equalsの()の引数の値が2020/04/02と同じである場合はtrueを返し、そうでない場合はfalseを返しています。
今回のポイント
日付を比較するには4種類のメソッドがある
日付を比較するにはbefore、after、compareTo、eaualsメソッドを使用する
• Dateクラスのbefore、after、compareTo、equalsメソッドで日付を比較する
• beforeメソッドは、パラメータの日付がインスタンスよりも未来だった場合に「true」を返し、過去だった場合に「false」を返す
• afterメソッドは、パラメータの日付がインスタンスよりも過去だった場合に「true」を返し、未来だった場合には「false」を返す
• compareToメソッドは、パラメータの日付がインスタンスよりも過去だった場合に「正の数値」を、未来だった場合に「負の数値」を返し、等しい場合には「0」を返す
• equalsメソッドは、パラメータの日付がインスタンスと等しかった場合に「true」を戻し、等しくない場合は「false」を返す
補足
Calenderクラスでの日付の比較について
CalendarクラスもDateクラスと同様にbefore、after、compareTo、equalsメソッドを使用して比較ができます。
ただし、Calendarは抽象クラスなので、getInstanceメソッドで取得したインスタンスのクラスが異なる場合があります。
その為、同じ日付ではあるが、equalsメソッドの判定結果が「false」になります。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// 日付を比較する import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; public class Main { public static void main(String[] args) throws Exception { // デフォルト(グレゴリオ暦) Calendar cld1 = Calendar.getInstance(); // 和暦 Calendar cld2 = Calendar.getInstance(new Locale("ja", "JP", "JP")); // クラス名の表示 System.out.println("cld1:" + cld1.getClass().getName()); System.out.println("cld2:" + cld2.getClass().getName()); // 時刻部分を切り捨てる cld1.set(Calendar.HOUR_OF_DAY, 0); cld1.set(Calendar.MINUTE, 0); cld1.set(Calendar.SECOND, 0); cld1.set(Calendar.MILLISECOND, 0); cld2.set(Calendar.HOUR_OF_DAY, 0); cld2.set(Calendar.MINUTE, 0); cld2.set(Calendar.SECOND, 0); cld2.set(Calendar.MILLISECOND, 0); // cldlとcld2を表示 SimpleDateFormat sdf = new SimpleDateFormat( "yyyy年MM月 dd日 HH時mm分 ss秒 S"); System.out.println("cld1:" + sdf.format(cld1.getTime())); System.out.println("cld2:" + sdf.format(cld2.getTime())); System.out.println(); // cld1とcld2を比較 System.out.println("equals :" + cld1.equals(cld2)); System.out.println("compareTo:" + cld1.compareTo(cld2)); } } |
出力結果
cal2:2020年07月 29日 00時00分 00秒 0
equals :false
compareTo:0
グレゴリオ暦と和暦とでは異なるクラスのため、「eauals」メソッドは必ず「false」を戻します。
その為、暦が異なる「Calendar」インスタンスの比較を行う場合は、before、after、compareToメソッドを使うようにしましょう。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。