web-dev-qa-db-ja.com

Javaで日付を比較する方法

Javaで日付間の比較をするにはどうすればいいですか?

例:

date1は22-02-2010です
date2は今日07-04-2010です
date3は25-12-2010です

date3は常にdate1より大きく、date2は常に今日です。今日の日付が日付1と日付3の間にあるかどうかを確認するにはどうすればよいですか。

355
ant

日付 には before および after のメソッドがあり、次のように 相互に比較 にできます。

if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
    // In between
}

包括的比較の場合:

if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
    /* historyDate <= todayDate <= futureDate */ 
}

Joda-Time を指定することもできますが、次の点に注意してください。

Joda-Timeは、Java SE 8より前のJavaのde facto標準日時ライブラリです。ユーザーは Java.timeJSR-31 )に移行するように求められます。

バックポートは、AndroidだけでなくJava 6および7でも使用できます。

561
Bart Kiers

compareTo :を使用してください。

date1.compareTo(date2);

120
Chandra Sekar S

以下は日付を比較する最も一般的な方法です。しかし私は最初のものを好む

アプローチ-1:Date.before()、Date.after()、Date.equals()を使う

            if(date1.after(date2)){
                System.out.println("Date1 is after Date2");
            }

            if(date1.before(date2)){
                System.out.println("Date1 is before Date2");
            }

            if(date1.equals(date2)){
                System.out.println("Date1 is equal Date2");
            }

アプローチ2:Date.compareTo()

           if(date1.compareTo(date2)>0){
                System.out.println("Date1 is after Date2");
            }else if(date1.compareTo(date2)<0){
                System.out.println("Date1 is before Date2");
            }else{
                System.out.println("Date1 is equal to Date2");
            }

アプローチ3:Calender.before()、Calender.after()およびCalender.equals()

Calendar cal1 = Calendar.getInstance();
            Calendar cal2 = Calendar.getInstance();
            cal1.setTime(date1);
            cal2.setTime(date2);

            if(cal1.after(cal2)){
                System.out.println("Date1 is after Date2");
            }

            if(cal1.before(cal2)){
                System.out.println("Date1 is before Date2");
            }

            if(cal1.equals(cal2)){
                System.out.println("Date1 is equal Date2");
            }
87

tl; dr

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean isBetween = 
    ( ! today.isBefore( localDate1 ) )  // “not-before” is short for “is-equal-to or later-than”.
    &&
    today.isBefore( localDate3 ) ; 

あるいは、ThreeTen-Extraライブラリをプロジェクトに追加した方が良いでしょう。

LocalDateRange.of(
    LocalDate.of( … ) ,
    LocalDate.of( … )
).contains(
    LocalDate.now()
)

開始は包含的で、終了は排他的です。

形式の悪い選択

ちなみに、それは日付または日付時刻値のテキスト表現のためのフォーマットの悪い選択です。可能な場合はいつでも、標準の ISO 8601 の形式に従ってください。 ISO 8601フォーマットは、曖昧さがなく、人間の文化を超えて理解でき、そして機械による解析が容易です。

日付のみの値の場合、標準形式はYYYY-MM-DDです。アルファベット順にソートすると、この形式が年代順になるという利点があることに注意してください。

LocalDate

LocalDate クラスは、時刻なしおよびタイムゾーンなしの日付のみの値を表します。

タイムゾーンは日付を決定するのに重要です。与えられた瞬間の間、日付はゾーンによって世界中で変わります。例えば、 Paris France の真夜中過ぎの数分後は、 MontréalQuébec の「昨日」に過ぎません。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

あなたの入力文字列は非標準フォーマットなので、私たちはそれにマッチするフォーマットパターンを定義しなければなりません。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );

入力文字列を解析するためにそれを使用してください。

LocalDate start = LocalDate.parse( "22-02-2010" , f );
LocalDate stop = LocalDate.parse( "25-12-2010" , f );

日付と時刻の作業では、通常、始まりが包括的で終わりが排他的であるHalf-Openアプローチで期間を定義するのが最善です。それで、今日がスタートと同じか遅いか、そしてストップの前であるかを知りたいのです。 「開始時と同じかそれより遅い」というより簡潔な言い方は、「開始前ではない」ということです。

Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;

gstackoverflowによる回答 を参照して、呼び出し可能な比較方法のリストを表示してください。


Java.timeについて

Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendar 、& SimpleDateFormat など、厄介な古い レガシー 日時クラスに代わるものです。

Joda-Time プロジェクトは現在 メンテナンスモード になっており、 Java.time クラスへの移行を推奨しています。

詳細は、 Oracleチュートリアル を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。仕様は JSR 310 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • バンドル実装の標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および SE 7
    • Java.timeの機能の多くは、 ThreeTen-Backport でJava 6および7にバックポートされています。
  • Android

ThreeTen-Extra プロジェクトは、追加クラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 IntervalYearWeekYearQuartermore などの便利なクラスがあります。


更新:以下のこの「Joda-Time」セクションは、歴史としてそのまま残されています。 Joda-Time プロジェクトは現在 メンテナンスモード になっており、 Java.time クラスへの移行を推奨しています。

ジョダタイム

バンドルされているJava.util.DateクラスとJava.util.Calendarクラスに関して、他の答えは正しいです。しかし、これらのクラスはよく知られているように面倒です。そのため、 Joda-Time 2.3ライブラリを使用したコード例がいくつかあります。

時間の一部も時間帯もない日付を本当に必要とする場合は、Joda-Timeの LocalDate クラスを使用してください。そのクラスはcompareToJava Comparators と共に使用される)、isBeforeisAfter、およびisEqualを含む比較メソッドを提供します。

入力…

String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";

入力文字列を記述するフォーマッタを定義する…

DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );

フォーマッタを使用して文字列をLocalDateオブジェクトに解析します…

LocalDate localDate1 = formatter.parseLocalDate( string1 );
LocalDate localDate2 = formatter.parseLocalDate( string2 );
LocalDate localDate3 = formatter.parseLocalDate( string3 );

boolean is1After2 = localDate1.isAfter( localDate2 );
boolean is2Before3 = localDate2.isBefore( localDate3 );

コンソールにダンプする…

System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );

実行すると…

Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true

2番目が他の2つの間にあるかどうかを確認してください(排他的に、どちらの端点にも等しくないことを意味します)…

boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );

時間の幅を使った作業

時間の幅を使って作業しているのであれば、Joda-Timeでクラスを探ることをお勧めします: DurationInterval 、および Periodoverlapcontainsなどのメソッドは、比較を容易にします。

テキスト表現については、ISO 8601規格の

  • 期間
    フォーマット:PnYnMnDTnHnMnS
    例:P3Y6M4DT12H30M5S
    (「3年6ヶ月4日12時間30分5秒」を意味します)
  • 間隔
    フォーマット:開始/終了
    例:2007-03-01T13:00:00Z/2008-05-11T15:30:00Z

Joda-Timeクラスは、入力(解析)と出力(文字列の生成)の両方として、これら両方の形式の文字列を扱うことができます。

Joda-Timeは、 Half-Open アプローチを使用して比較を実行します。ここで、スパンの始まりは包括的、終わりは排他的です。このアプローチは時間の幅を扱うための賢明なアプローチです。詳細についてはStackOverflowを検索してください。

27
Basil Bourque

2つの日付を比較してください。

  Date today = new Date();                   
  Date myDate = new Date(today.getYear(),today.getMonth()-1,today.getDay());
  System.out.println("My Date is"+myDate);    
  System.out.println("Today Date is"+today);
  if (today.compareTo(myDate)<0)
      System.out.println("Today Date is Lesser than my Date");
  else if (today.compareTo(myDate)>0)
      System.out.println("Today Date is Greater than my date"); 
  else
      System.out.println("Both Dates are equal"); 
20
sam

Java 8以降用のアップデート

これらのメソッドは、 LocalDateLocalTime 、および LocalDateTime クラスに存在します。

これらのクラスはJava 8以降に組み込まれています。 Java.timeの機能の多くは ThreeTen-Backport でJava 6と7にバックポートされ、さらに ThreeTen-ABPAndroid に適応しています( 使い方… )。

15
gstackoverflow

Date.getTime() whichを使えます。

このDateオブジェクトによって表される1970年1月1日、GMT 00:00:00から経過したミリ秒数を返します。

これは、数字のようにそれらを比較できることを意味します。

if (date1.getTime() <= date.getTime() && date.getTime() <= date2.getTime()) {
    /*
     * date is between date1 and date2 (both inclusive)
     */
}

/*
 * when date1 = 2015-01-01 and date2 = 2015-01-10 then
 * returns true for:
 * 2015-01-01
 * 2015-01-01 00:00:01
 * 2015-01-02
 * 2015-01-10
 * returns false for:
 * 2014-12-31 23:59:59
 * 2015-01-10 00:00:01
 * 
 * if one or both dates are exclusive then change <= to <
 */
11
Salman A

GetTime()を使用して日付の数値を取得してから、返された値を使用して比較します。

5
Everyone

これを試して

public static boolean compareDates(String psDate1, String psDate2) throws ParseException{
        SimpleDateFormat dateFormat = new SimpleDateFormat ("dd/MM/yyyy");
        Date date1 = dateFormat.parse(psDate1);
        Date date2 = dateFormat.parse(psDate2);
        if(date2.after(date1)) {
            return true;
        } else {
            return false;
        }
    }
4
Garambe

このコードは、今日が一定期間であると判断します.. KOREAロケールに基づいて

    Calendar cstart = Calendar.getInstance(Locale.KOREA);
    cstart.clear();
    cstart.set(startyear, startmonth, startday);


    Calendar cend = Calendar.getInstance(Locale.KOREA);
    cend.clear();
    cend.set(endyear, endmonth, endday);

    Calendar c = Calendar.getInstance(Locale.KOREA);

    if(c.after(cstart) && c.before(cend)) {
        // today is in startyear/startmonth/startday ~ endyear/endmonth/endday
    }
0
Brownsoo Han

この方法は私のために働いた:

 public static String daysBetween(String day1, String day2) {
    String daysBetween = "";
    SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {
        Date date1 = myFormat.parse(day1);
        Date date2 = myFormat.parse(day2);
        long diff = date2.getTime() - date1.getTime();
        daysBetween = ""+(TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return daysBetween;
}
0
Iman Marashi