webentwicklung-frage-antwort-db.com.de

Datumsvergleich mit Java

Ich habe zwei Termine:

  1. toDate (Benutzereingabe im MM/dd/yyyy-Format)
  2. currentDate (erhalten von new Date()

Ich muss currentDate mit toDate vergleichen. Ich muss einen Bericht nur anzeigen, wenn toDate gleich oder größer als currentDate ist. Wie kann ich das machen?

31
minil

Es ist einfacher, Datumsangaben mit dem Java.util.Calendar..__ zu vergleichen.

Calendar toDate = Calendar.getInstance();
Calendar nowDate = Calendar.getInstance();
toDate.set(<set-year>,<set-month>,<set-day>);  
if(!toDate.before(nowDate)) {
    //display your report
} else {
    // don't display the report
}
18
Abdel Raoof

Wenn Sie Java-Daten anstelle von JodaTime verwenden möchten, verwenden Sie einen Java.text.DateFormat , um die Zeichenfolge in ein Datum zu konvertieren. Vergleichen Sie die beiden mit .equals:

Ich habe fast vergessen: Sie müssen die Stunden, Minuten, Sekunden und Millisekunden am aktuellen Datum auf Null setzen, bevor Sie sie vergleichen. Ich habe dazu ein Calendar object benutzt.

import Java.text.DateFormat;
import Java.util.Calendar;
import Java.util.Date;

// Other code here
    String toDate;
    //toDate = "05/11/2010";

    // Value assigned to toDate somewhere in here

    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
    Calendar currDtCal = Calendar.getInstance();

    // Zero out the hour, minute, second, and millisecond
    currDtCal.set(Calendar.HOUR_OF_DAY, 0);
    currDtCal.set(Calendar.MINUTE, 0);
    currDtCal.set(Calendar.SECOND, 0);
    currDtCal.set(Calendar.MILLISECOND, 0);

    Date currDt = currDtCal.getTime();

    Date toDt;
    try {
        toDt = df.parse(toDate);
    } catch (ParseException e) {
        toDt = null;
        // Print some error message back to the user
    }

    if (currDt.equals(toDt)) {
        // They're the same date
    }
11
Powerlord

Date#equals() und Date#after()

Wenn die Möglichkeit besteht, dass die Felder hour und minute! = 0 sind, müssen Sie sie auf 0 setzen.

Ich kann nicht vergessen zu erwähnen, dass die Verwendung von Java.util.Date eine schlechte Praxis ist und die meisten Methoden veraltet sind. Verwenden Sie, falls möglich, Java.util.Calendar oder JodaTime .

6
Bozho

Sie suchen wahrscheinlich:

!toDate.before(currentDate)

vor () und nach () testen, ob das Datum strikt vor oder nach dem Datum liegt. Sie müssen also die Negation des anderen nehmen, um nicht strenges Verhalten zu erhalten.

5
tkr

Dies ist eine der Möglichkeiten:

String toDate = "05/11/2010";

if (new SimpleDateFormat("MM/dd/yyyy").parse(toDate).getTime() / (1000 * 60 * 60 * 24) >= System.currentTimeMillis() / (1000 * 60 * 60 * 24)) {
    System.out.println("Display report.");
} else {
    System.out.println("Don't display report.");
}

Etwas einfacher interpretierbar:

String toDateAsString = "05/11/2010";
Date toDate = new SimpleDateFormat("MM/dd/yyyy").parse(toDateAsString);
long toDateAsTimestamp = toDate.getTime();
long currentTimestamp = System.currentTimeMillis();
long getRidOfTime = 1000 * 60 * 60 * 24;
long toDateAsTimestampWithoutTime = toDateAsTimestamp / getRidOfTime;
long currentTimestampWithoutTime = currentTimestamp / getRidOfTime;

if (toDateAsTimestampWithoutTime >= currentTimestampWithoutTime) {
    System.out.println("Display report.");
} else {
    System.out.println("Don't display report.");
}

Oh, als Bonus die JodaTime s Variante:

String toDateAsString = "05/11/2010";
DateTime toDate = DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(toDateAsString);
DateTime now = new DateTime();

if (!toDate.toLocalDate().isBefore(now.toLocalDate())) {
    System.out.println("Display report.");
} else {
    System.out.println("Don't display report.");
}
4
BalusC

Date long getTime() gibt die Anzahl der Millisekunden seit January 1, 1970, 00:00:00 GMT zurück, die durch dieses Date-Objekt dargestellt wird.

//test if date1 is before date2
if(date1.getTime() < date2.getTime()) {
....
}
3
Mark Z

private boolean checkDateLimit () {

    long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1
    long Date1InMilisecond = Date1.getTimeInMillis(); //Date2

    if (CurrentDateInMilisecond <= Date1InMilisecond) {
        return true;
    } else {
        return false;
    }

}

// Konvertiere beide Datumsangaben in Millisekunden.

2
Viren Savaliya

Wenn Sie aus irgendeinem Grund Date-Objekte für Ihre Lösung verwenden möchten, müssen Sie Folgendes tun:


    // Convert user input into year, month, and day integers
    Date toDate = new Date(year - 1900, month - 1, day + 1);
    Date currentDate = new Date();
    boolean runThatReport = toDate.after(currentDate);

Wenn Sie die Variable toDate auf Mitternacht des nächsten Tages verschieben, wird der Fehler behoben, über den ich in den Kommentaren zu anderen Antworten geheult habe. Beachten Sie jedoch, dass dieser Ansatz einen veralteten Konstruktor verwendet. Jeder Ansatz, der sich auf Date stützt, verwendet eine veraltete Methode oder eine andere, und je nachdem, wie Sie vorgehen, kann dies ebenfalls zu Rennbedingungen führen (wenn Sie toDate von new Date() abhängen und dann beispielsweise mit Jahr, Monat und Tag herumspielen ). Verwenden Sie Calendar wie an anderer Stelle beschrieben.

1
BlairHippo

Verwenden Sie Java.util.Calendar, wenn Sie eine umfangreiche datumsbezogene Verarbeitung haben.

Datum hat before(), after() Methoden. Sie könnten sie auch verwenden.

0
Vaishak Suresh