Ich möchte zwei Termine vergleichen, aber ich habe Probleme. Ein Datum wird aus einem Java.util.date
-Objekt erstellt und das andere wird manuell erstellt. Der folgende Code ist ein Beispiel:
Date ds = new Date();
DateTime d = new DateTime(ds);
DateTime e = new DateTime(2012,12,07, 0, 0);
System.out.println(d.isEqual(e));
Der Test stellt sich jedoch als false
heraus. Ich vermute, dass es an der Zeit liegt. Wie kann ich überprüfen, ob diese beiden Termine gleich sind (ich meine, dass Jahr, Monat, Datum identisch sind)?
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight()));
oder
System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay()));
Sie sollten toLocalDate () verwenden:
date1.toLocalDate().isEqual(date2.toLocalDate())
Dadurch wird der Time-Teil der DateTime entfernt.
Es gibt einen anderen Ansatz, aber es berücksichtigt nicht den Fall, bei dem die beiden Datumsangaben eine andere Zeitzone haben, und ist daher weniger zuverlässig:
date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay())
return DateTimeComparator.getDateOnlyInstance().compare(first, second);
Wenn Sie Zeitkomponenten ignorieren möchten (d. H. Sie möchten nur Datumsangaben vergleichen), können Sie die DateMidnight-Klasse anstelle von Date Time verwenden. Ihr Beispiel sieht also ungefähr so aus:
Date ds = new Date();
DateMidnight d = new DateMidnight(ds);
DateMidnight e = new DateMidnight(2012, 12, 7);
System.out.println(d.isEqual(e));
Aber Achtung, es wird nur heute "true" gedruckt :)
Beachten Sie außerdem, dass standardmäßig JDK Date und alle Joda-Time-Sofortklassen (einschließlich DateTime und DateMidnight) unter Verwendung der Standardzeitzone erstellt werden. Wenn Sie also ein Datum zum Vergleich im Code erstellen, aber ein anderes Datum aus der Datenbank abrufen, in dem Datumsangaben in UTC gespeichert werden, kann es zu Inkonsistenzen kommen, vorausgesetzt, Sie befinden sich nicht in der UTC-Zeitzone.
Da es sich um DateTime-Objekte handelt, werden deren Zeitanteile beim Vergleich berücksichtigt. Setzen Sie die Zeitteile des ersten Datums auf 0, beispielsweise:
d = d.withTime(0, 0, 0, 0);
Ich stolperte in diese Frage, als ich nach einem Vergleich mit dem heutigen suchte. So können Sie ein Datum mit dem heutigen Tag vergleichen:
date1.toLocalDate().isBeforeNow() // works also with isAfterNow
Dies ist eine statische Methode, die für mich funktioniert.
public static boolean isSameDay(DateTime date1, DateTime date2){
return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay());
}