2012-12-07 6 views
25

Chcę porównać dwie daty, więc biegnę w kłopoty. 1 data jest tworzona z obiektu java.util.date, a druga jest tworzona ręcznie. Poniższy kod jest przykładem:Porównując dwie daty ustawienia czasu Joda

Date ds = new Date(); 
DateTime d = new DateTime(ds); 

DateTime e = new DateTime(2012,12,07, 0, 0); 
System.out.println(d.isEqual(e)); 

Jednak testy okazuje false. Zgaduję, że to z powodu czasu. Jak mogę sprawdzić, czy te dwie daty są sobie równe (mam na myśli Rok, miesiąc, datę są identyczne)?

+0

FYI, w [Joda-Time] (http://www.joda.org/joda-time/) projekt jest teraz w [trybie konserwacji] (https://en.wikipedia.org/wiki/Maintenance_mode), a zespół doradza przy migracji do [java.time] (http : //docs.oracle.com/javase/9/docs/api/java/time/package-summary.html) klasy. Zobacz [Tutorial by Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Odpowiedz

44
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight())); 

lub

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay())); 
+5

toDateMidnight() jest przestarzałe i nie powinno być używane.Zamiast withTimeAtStartOfDay() może być używany, ale wciąż nie jest optymalne, ponieważ nie usunąć strefę czasową, więc jeśli te dwa terminy mają różne strefy czasowe, oni nigdy nie będą równe. – Stan

+3

Używam 'toLocalDate()', które, jak przypuszczam, ma ten sam problem. Aby tego uniknąć Chyba mógł łańcuch 'withZone()', np .: 'd.toLocalDate(). IsEqual (e.withZone (d.zone) .toLocalDate())'. Zauważ, że to _nie_ zostało przetestowane. –

+1

To nie zadziała, jeśli d i e to różne strefy czasowe. Odpowiedź Charlesa Wooda powyżej jest bardziej wiarygodna. –

1

Jak oni DateTime obiektów, ich części czasowe są również brane pod uwagę, gdy jesteś ich porównanie. Spróbuj ustawić części czasie pierwszego terminu 0, jak:

d = d.withTime(0, 0, 0, 0); 
-5

Napisz własną metodę

public boolean checkEqual(DateTime first,DateTime second){ 
    if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){ 
     return true; 
    } 
return false; 
} 
+0

Typy są takie same, przeczytaj uważnie to pytanie. Obie są DateTime. –

+2

Jest to całkowicie niepotrzebne, ponieważ Joda Time ma wiele narzędzi użytkowych, które robią dokładnie to samo. –

3

Jeśli chcesz ignorować komponenty czasowe (tzn. chcesz porównać tylko daty) możesz użyć klasy DateMidnight zamiast Date Time. Więc twój przykład będzie wyglądać mniej więcej tak:

Date ds = new Date(); 
DateMidnight d = new DateMidnight(ds); 

DateMidnight e = new DateMidnight(2012, 12, 7); 
System.out.println(d.isEqual(e)); 

Ale uwaga, to wydrukować „true” tylko dzisiaj :)

Należy również pamiętać, że domyślnie JDK Data i wszystkich klasach błyskawicznych Joda czasu (DateTime i DateMidnight włączone) są konstruowane przy użyciu domyślnej strefy czasowej. Jeśli więc utworzysz jedną datę do porównania w kodzie, ale pobierzesz inną z DB, która prawdopodobnie przechowuje daty w UTC, możesz napotkać niespójności, zakładając, że nie znajdujesz się w strefie czasowej UTC.

+0

DateMidnight w czasie pakietu jest przestarzała sugestia jest użycie LOCALDATE –

+0

Wszystkie zajęcia związane z północy, oraz metody i sposoby są przestarzałe, wyparta przez „pierwszej chwili dnia” koncepcji i metod. –

15

Należy użyć toLocalDate():

date1.toLocalDate().isEqual(date2.toLocalDate()) 

To będzie pozbyć się razem część DateTime.

jest inne podejście, ale nie uwzględnia przypadku, gdy oba terminy mają inną strefę czasową, więc jest to mniej wiarygodne:

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()) 
0

Jest to metoda statyczna, która działa dla mnie.

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

nie widzę korzystać z istniejącej [Odpowiedź] (https://stackoverflow.com/a/21553438/642706) używając 'toLocalDate'. Z wyjątkiem tego, że jeden nie powiedzie się, jeśli obiekty 'DateTime' mają różne strefy czasowe, podczas gdy inne podejście Answers nie. To, czy jest to dobre czy złe, zależy od problemu biznesowego. –

-1
DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2); 

obj1 i obj2 może być ciągiem, Długi, data (java.util) ... Dla szczegółów patrz http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

+1

Witamy w Stack Overflow! Przed udzieleniem odpowiedzi na pytanie zawsze czytaj istniejące odpowiedzi. Ta odpowiedź została już dostarczona. Zamiast powtarzać odpowiedź, zagłosuj na istniejącą odpowiedź. Niektóre wskazówki dotyczące pisania dobrych odpowiedzi można znaleźć [tutaj] (https://stackoverflow.com/help/how-to-answer). – dferenc