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
equals
sagen wir „Vergleicht ... sicherzustellen , dass das Datum der gleiche ist“ . Das klingt in Ihrem Fall nach dem Richtigen.Antworten:
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 anwendenLocalDate
.isAfter()
isBefore()
isEqual()
Beachten Sie, dass alle diese Methoden die
compareTo0()
Methode verwenden, und überprüfen Sie einfach dencmp
Wert. Wenn Sie immer noch ein seltsames Ergebnis erhalten (was Sie nicht sollten), fügen Sie bitte ein Beispiel für Eingabe und Ausgabe beiquelle
LocalData.equals
unterscheidet sich vonLocalDate.isEqual
? Ihre Antwort könnte etwas mehr Erklärung gebrauchen.compareTo0()
Methode." Das ist interessant! Heißt das , dassequals
,isEqual
undcompareTo(other) == 0
ist gleichwertig? Die Dokumentation ist etwas unklar.equals
undisEquals
beide benutzenreturn compareTo0((LocalDate) obj) == 0;
also ja. Der Unterschied ist, dass gleich erste Prüfung,instanceOf
währendisEqual
stark getippt istChronoLocalDate
equals()
akzeptiertObject
und false zurückgibt, wenn Sie etwas übergeben, das keine Instanz von istLocalDate
.quelle
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; }
quelle
toDateTimeAtCurrentTime
problematisch.toDateTimeAtCurrentTime
existiert nicht in derLocalDate
Klasse.