2012-10-19 13 views
16

Chcę porównać dwa obiekty kalendarza, aby sprawdzić, czy obie zawierają tę samą datę. Nie interesuje mnie żadna wartość poniżej dni.Porównywanie dwóch obiektów kalendarza

I zostały wdrożone to i nie mogę myśleć o każdym przypadku powinno to fail:

private static boolean areEqualDays(Calendar c1, Calendar c2) { 
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
    return (sdf.format(c1.getTime()).equals(sdf.format(c2.getTime()))); 
} 

Czy to podejście prawidłowe, czy powinienem porównać pole C1 i C2 przez pole?

+0

Przed zadaniem pytania skorzystaj z funkcji wyszukiwania i/lub wyszukiwarki. – dngfng

+0

dotyczące "porównywania c1 i c2" http://stackoverflow.com/questions/1505496/skorzystania-dopasowania-kalendowania-do porównania- – manas

+1

To jest coś innego. Pytam o to, czy jest to poprawne podejście, czy też ma wady, o których nie wiem. Nie to samo, co pytanie, jak to zrobić. – razielsarafan

Odpowiedz

15

I zostały wdrożone to i nie mogę myśleć o każdym przypadku powinno to fail

będzie zawodzić, jeśli oba kalendarze są w różnych strefach czasowych - mogą one reprezentować dokładnie to samo millisecond, ale ta chwila może przypadać na różne dni w zależności od strefy czasowej.

Spowoduje to również niepowodzenie, jeśli dwa kalendarze będą reprezentować różne systemy kalendarzy - nawet jeśli będą reprezentować ten sam "dzień", jeśli dwa kalendarze będą reprezentować ten dzień w inny sposób, można argumentować, że powinien on zawieść.

Osobiście byłoby silnie radzimy używać Joda Time który ma typ LocalDate do reprezentowania tylko datę - że będzie pozbyć się problemu strefie czasowej, ale nie kwestia system kalendarzowy. Jeśli zawsze możesz założyć, że używasz tego samego systemu kalendarza, to jest w porządku.

(Dodatkowo, wykonywanie operacji na ciągach tylko dla celów porównawczych jest brzydkie - po prostu sprawdzę bezpośrednio calendar.get(Calendar.YEAR) itd.)

+0

Oba są generowane w aplikacji, nie zawiedzie, chyba że przekroczysz strefę czasową podczas jej używania, a ponieważ aplikacja jest skierowana tylko do Hiszpanii, nie martwię się tym problemem. – razielsarafan

+1

@ santirivera92: "Wygenerowane w aplikacji" nie oznacza koniecznie "wygenerowany w tej samej strefie czasowej" - nawet jeśli brzmi to tak, jak to drugie. Osobiście * przynajmniej * umieszczałbym komentarze na ten temat ... jest to rzecz, którą łatwo przegapić, gdy zmieniają się wymagania. –

1

Klasa kalendarza ma metodę compareTo. Dlaczego nie nazywasz tego bezpośrednio?

+1

To by porównać datę * i czas * ... –

+0

hmm ... tak..i nie przeczytałem całkowicie pytania –

40

SpróbujcompareTo

Calendar c1 = Calendar.getInstance(); 
Calendar c2 = Calendar.getInstance(); 
c1.compareTo(c2); 

Returns:

wartość 0, gdy czas reprezentowany przez argument jest równy czasowi reprezentowanego przez ten kalendarz; wartość mniejsza niż 0, jeśli czas tego kalendarza jest przed czasem reprezentowanym przez argument; i wartość większą niż 0, jeśli czas tego kalendarza jest po czasie reprezentowanym przez argument.

EDIT

import org.apache.commons.lang3.time.DateUtils; 

Można użyć DateUtils.isSameDay aby sprawdzić, czy jest to ten sam dzień.

boolean isSameDay = DateUtils.isSameDay(c1, c2); 

28 marca 2002 13:45 i 28 marca 2002 06:01 powróciłby prawdą. 28 marca 2002 13:45 i 12 marca 2002 13:45 zwrócą fałsz.

+0

To powie, że dziś 10 rano jest dziś nierównomierna do 11.00 - w przeciwieństwie do metody OP. OP jest zainteresowany tylko * datą *. –

+0

Dziękuję. Twoje rozwiązanie sprawdziło się doskonale. +1 .. –

8

Można użyć somehing jak DateUtils

public boolean isSameDay(Calendar cal1, Calendar cal2) { 
    if (cal1 == null || cal2 == null) 
     return false; 
    return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) 
      && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) 
      && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR)); 
} 
1

Aby porównać dwie daty w odniesieniu do konkretnej dziedzinie, należy najpierw ustawić wszystkie pola poniżej tego jednego do najniższej wartości (co jest 0 lub 1 w zależności od dziedziny) za pomocą Calendar.set (pole int, wartość int), a następnie porównaj. Aby porównać różniące się w dniach między cal1 i cal2, ustawisz MINUTE, SECOND i MILLISECOND na obu obiektach na 0 przed wywołaniem cal1.compare (cal2).

Powiązane problemy