So vergleichen Sie LocalDate-Instanzen Java 8

72

Ich schreibe eine App, deren Datumsangaben ziemlich genau sein müssen, und ich frage mich, wie ich LocalDate-Instanzen vergleichen kann. Im Moment habe ich Folgendes verwendet:

LocalDate localdate1 = LocalDate().now();
LocalDate localdate2 = someService.getSomeDate();
localdate1.equals(localdate2);

Aber ich habe festgestellt, dass meine App mir einige verwirrende Ergebnisse liefert, und ich denke, das liegt am Vergleich der Daten.

Ich denke darüber nach, die Zeit von 1970 'lange zu erhalten und diese beiden zu vergleichen, aber ich muss einfacher sein, da bin ich mir sicher

Azalut
quelle
Was für verwirrende Ergebnisse? Die dox für equalssagen wir „Vergleicht ... sicherzustellen , dass das Datum der gleiche ist“ . Das klingt in Ihrem Fall nach dem Richtigen.
Lii
Es war mein Fehler, die Ursache des Problems lag in etwas anderem, aber ich bin immer noch neugierig, ob dies eine angemessene Methode ist, um LocalDates zu vergleichen :)
Azalut
Vermeiden Sie dies, wenn Sie eine Count-from-Epoche von 1970 verwenden möchten. Es ist verwirrend und schwer zu debuggen. Die modernen java.time-Klassen machen eine solche umständliche Handhabung überflüssig.
Basil Bourque

Antworten:

108

Verwenden überschreibt gleich:equals() LocalDate

int compareTo0(LocalDate otherDate) {
    int cmp = (year - otherDate.year);
    if (cmp == 0) {
        cmp = (month - otherDate.month);
        if (cmp == 0) {
            cmp = (day - otherDate.day);
        }
    }
    return cmp;
}

Wenn Sie mit dem Ergebnis von nicht zufrieden sind equals(), können Sie die vordefinierten Methoden von gut anwenden LocalDate.

Beachten Sie, dass alle diese Methoden die compareTo0()Methode verwenden, und überprüfen Sie einfach den cmpWert. Wenn Sie immer noch ein seltsames Ergebnis erhalten (was Sie nicht sollten), fügen Sie bitte ein Beispiel für Eingabe und Ausgabe bei

royB
quelle
1
" Ich werde die Objekte vergleichen" Ich finde das schwer zu verstehen, was meinst du damit? Wie LocalData.equalsunterscheidet sich von LocalDate.isEqual? Ihre Antwort könnte etwas mehr Erklärung gebrauchen.
Lii
@Lii Sie können meine aktualisierte Antwort überprüfen. Ich habe vorherige Bearbeitung entfernt und einige weitere Informationen hinzugefügt
RoyB
"Alle diese Methoden verwenden die compareTo0()Methode." Das ist interessant! Heißt das , dass equals, isEqualund compareTo(other) == 0 ist gleichwertig? Die Dokumentation ist etwas unklar.
Lii
3
equalsund isEqualsbeide benutzen return compareTo0((LocalDate) obj) == 0;also ja. Der Unterschied ist, dass gleich erste Prüfung, instanceOfwährend isEqualstark getippt istChronoLocalDate
RoyB
@Lii @royB Ich wollte nur angeben, dass a equals()akzeptiert Objectund false zurückgibt, wenn Sie etwas übergeben, das keine Instanz von ist LocalDate.
ItachiUchiha
2
LocalDate ld ....;
LocalDateTime ldtime ...;

ld.isEqual(LocalDate.from(ldtime));
Stepi
quelle
3
Willkommen bei Stack Overflow! Auch wenn dies die Frage beantworten kann, gibt es keine Erklärung für Ihren Code. Bitte aktualisieren Sie Ihre Antwort, um zu erklären, was Sie tun. Vielen Dank!
Miroslav Glamuzina
0

Ich glaube, dieses Snippet wird auch in einer Situation hilfreich sein, in der der Datumsvergleich mehr als zwei Einträge umfasst.

static final int COMPARE_EARLIEST = 0;

static final int COMPARE_MOST_RECENT = 1;


public LocalDate getTargetDate(List<LocalDate> datesList, int comparatorType) { 
   LocalDate refDate = null;
   switch(comparatorType)
   {
       case COMPARE_EARLIEST:         
       //returns the most earliest of the date entries
          refDate = (LocalDate) datesList.stream().min(Comparator.comparing(item -> 
                      item.toDateTimeAtCurrentTime())).get();
          break;

       case COMPARE_MOST_RECENT:
          //returns the most recent of the date entries 
          refDate = (LocalDate) datesList.stream().max(Comparator.comparing(item -> 
                    item.toDateTimeAtCurrentTime())).get();
          break;
   }

   return refDate;
}
Chigozie D.
quelle
@Chan Tan: Vielen Dank für die Bearbeitung, brauchen einige Zeit, um sich mit den Formatierungen des Inhaltseditors zu akklamatisieren.
Chigozie D.
1
Dieser Code ist fragil. Ich würde es nicht empfehlen. Insbesondere wenn es zufällig ausgeführt wird, während das lokale Datum von einem Tag zum nächsten wechselt, wäre die Verwendung von toDateTimeAtCurrentTimeproblematisch.
JakeRobb
Methode toDateTimeAtCurrentTimeexistiert nicht in der LocalDateKlasse.
Belgoros