web-dev-qa-db-ja.com

Javaの2つの日付を比較する

Javaで2つの日付を比較する必要があります。私はこのようなコードを使用しています:

Date questionDate = question.getStartDate();
Date today = new Date();

if(today.equals(questionDate)){
    System.out.println("Both are equals");
}

これは機能していません。変数の内容は次のとおりです。

  • questionDateには2010-06-30 00:31:40.0が含まれます
  • todayにはWed Jun 30 01:41:25 IST 2010が含まれます

どうすれば解決できますか?

25
Gnaniyar Zubair

日付の等価性は、2つの日付がミリ秒に等しいことに依存します。 new Date()を使用して新しいDateオブジェクトを作成しても、過去に作成された日付と等しくなることはありません。 Joda Time のAPIは、日付の操作を簡素化します。ただし、JavaのSDKのみを使用する場合:

if (removeTime(questionDate).equals(removeTime(today)) 
  ...

public Date removeTime(Date date) {    
    Calendar cal = Calendar.getInstance();  
    cal.setTime(date);  
    cal.set(Calendar.HOUR_OF_DAY, 0);  
    cal.set(Calendar.MINUTE, 0);  
    cal.set(Calendar.SECOND, 0);  
    cal.set(Calendar.MILLISECOND, 0);  
    return cal.getTime(); 
}
42
Eric Hauser

これにはJodaTimeを使用します。次に例を示します。2つの日付の日数の差を見つけたいとします。

DateTime startDate = new DateTime(some_date); 
DateTime endDate = new DateTime(); //current date
Days diff = Days.daysBetween(startDate, endDate);
System.out.println(diff.getDays());

JodaTimeは here からダウンロードできます。

13
CoolBeans

あなたが何を望むのかは明確ではありませんが、 Date クラスには compareTo メソッドもあります。オブジェクトは等しいか(等しくない場合)、より早く発生します。これにより、次のようなことができます。

switch (today.compareTo(questionDate)) {
    case -1:  System.out.println("today is sooner than questionDate");  break;
    case 0:   System.out.println("today and questionDate are equal");  break;
    case 1:   System.out.println("today is later than questionDate");  break;
    default:  System.out.println("Invalid results from date comparison"); break;
}

APIドキュメントでは、結果が-1、0、1になることを保証していないことに注意してください。そのため、実動コードではスイッチではなくif-elsesを使用することができます。また、2番目の日付がnullの場合、NullPointerExceptionが発生するため、try-catchでコードをラップすると便利です。

10
GreenMatt

2つの日付を比較する最も簡単な方法は、それらを数値(Unixタイムスタンプなど)に変換することです。

Unix時間を返すDate.getTime()メソッドを使用できます。

Date questionDate = question.getStartDate();
Date today = new Date();
if((today.getTime() == questionDate.getTime())) {
    System.out.println("Both are equals");
}
5
Jamal

Java.time

Java 8では、 Joda-Time を使用する必要はありません。 Java.time パッケージ。 LocalDate クラスを使用します。

LocalDate date = LocalDate.of(2014, 3, 18);
LocalDate today = LocalDate.now();

Boolean isToday = date.isEqual( today );

Period クラスを使用して、日付間の期間を要求できます。

Period difference = Period.between(date, today);

LocalDateは、 equalscompareTo を使用して比較できます。これは、時間とタイムゾーンに関する情報を保持しないためです。


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.DateCalendar 、& SimpleDateFormat

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

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

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

  • Java SE 8Java SE 9 以降、
    • ビルトイン。
    • 標準の一部Java実装がバンドルされたAPI。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および Java SE 7
  • Android
    • Android Java.timeクラスのバンドル実装の最新バージョン。
    • 以前のAndroidの場合、 ThreeTenABP プロジェクトが適応しますThreeTen-Backport(上記)。 ThreeTenABPの使用方法… を参照してください。

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

3
recke96

time.compareTo(currentTime) < 0を使用して簡単です

import Java.util.Calendar;
import Java.util.Date;
import Java.util.Timer;
import Java.util.TimerTask;

public class MyTimerTask {
    static Timer singleTask = new Timer();

    @SuppressWarnings("deprecation")
    public static void main(String args[]) {
        // set download schedule time
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 9);
        calendar.set(Calendar.MINUTE, 54);
        calendar.set(Calendar.SECOND, 0);
        Date time = (Date) calendar.getTime();
        // get current time
        Date currentTime = new Date();
        // if current time> time schedule set for next day
        if (time.compareTo(currentTime) < 0) {

            time.setDate(time.getDate() + 1);
        } else {
            // do nothing
        }
        singleTask.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("timer task is runing");
            }
        }, time);

    }

}
3
harsha.kuruwita

以下は、2つのカレンダー変数の年が同じ場合にtrueを返します。

  public boolean isSameDay(Calendar c1, Calendar c2){
    final int DAY=1000*60*60*24;
    return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY));
  } // end isSameDay
1
user569712
public long compareDates(Date exp, Date today){

        long b = (exp.getTime()-86400000)/86400000;
        long c = (today.getTime()-86400000)/86400000;
        return b-c;
    }

これはGregorianDates. 86400000は1日のミリ秒数であり、2つの日付間の日数を返します。

0
PT_C
public static double periodOfTimeInMillis(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime());
}

public static double periodOfTimeInSec(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / 1000;
}

public static double periodOfTimeInMin(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (60 * 1000);
}

public static double periodOfTimeInHours(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (60 * 60 * 1000);
}

public static double periodOfTimeInDays(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000L);
}
0
yurin

それが最適です...

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();

cal1.setTime(date1);
cal2.setTime(date2);

boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
0
piyush

私の場合、私はこのようなことをしなければなりませんでした:

date1.toString().equals(date2.toString())

そしてそれはうまくいきました!

0
Rafa Ayadi

ここに別の答えがあります:ストリングとして比較できるように、同じfromatに合うようにけん引日付をフォーマットする必要があります。

    Date questionDate = question.getStartDate();
    Date today = new Date();

    SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd");

    String questionDateStr = dateFormatter.format(questionDate);
    String todayStr = dateFormatter.format(today);

    if(questionDateStr.equals(todayStr)) {
        System.out.println("Both are equals");
    }
0
Jamal

これは非常に古い投稿ですが、私の作品を共有しています。これを行うための小さなトリックがあります

DateTime dtStart = new DateTime(Dateforcomparision); 
DateTime dtNow = new DateTime(); //current date

if(dtStart.getMillis() <= dtNow.getMillis())
{
   //to do
}

要件に応じてコンパレータを使用します

0