it-swarm.com.de

Vergleich von zwei Daten mit der Joda-Zeit

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)?

28
Marc Rasmussen
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight()));

oder

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay()));
46
JB Nizet

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())
18
Stan
return DateTimeComparator.getDateOnlyInstance().compare(first, second);

Via Wie vergleicht man zwei Termine ohne Zeitanteil?

6
Vadzim

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.

3
Andrii Polunin

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);
1
Hiery Nomus

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
1
Ismail H

Dies ist eine statische Methode, die für mich funktioniert.

public static boolean isSameDay(DateTime date1, DateTime date2){
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay());
}
0
BaptisteM