2012-10-19 4 views
16

Desidero confrontare due oggetti del Calendario per vedere se entrambi contengono la stessa data. Non mi importa di nessun valore sotto i giorni.Confronto di due oggetti del calendario

Ho implementato questo e non posso pensare a qualsiasi caso in cui si dovrebbe dare errore:

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()))); 
} 

È questo approccio corretto o devo confrontare campo C1 e C2 da campo?

+0

Si prega di utilizzare la funzione di ricerca e/o il motore di ricerca di propria scelta prima di fare una domanda. – dngfng

+0

in merito a "confronto c1 e c2" http://stackoverflow.com/questions/1505496/should-i-use-calendar-compareto-to-compare-dates – manas

+1

È una cosa diversa. Sto chiedendo se è un approccio corretto o se ha dei difetti che non conosco. Non è come chiedere come farlo. – razielsarafan

risposta

15

Ho implementato questo e non posso pensare a qualsiasi caso in cui si dovesse fallire

avrà esito negativo se i due calendari sono in diversi fusi orari - che potrebbe rappresentare la esattamente lo stesso millisecondo, ma quell'istante potrebbe cadere in giorni diversi in base al fuso orario.

Probabilmente fallirà anche se i due calendari rappresentano sistemi di calendario diversi - anche se rappresentano lo stesso "giorno", se i due calendari rappresenterebbero quel giorno in modo diverso, si potrebbe sostenere che non dovrebbe riuscire.

Personalmente, vorrei vivamente consigliamo di utilizzare Joda Time, che ha un tipo di LocalDate per rappresentare solo una data - che sbarazzarsi del problema del fuso orario, ma non la questione sistema di calendario. Se puoi sempre presumere che stai usando lo stesso sistema di calendario, allora va bene.

(Inoltre, eseguire operazioni di stringa solo a scopo di confronto è brutto - vorrei solo controllare direttamente calendar.get(Calendar.YEAR) ecc.)

+0

Entrambi sono generati nell'app, non fallirà a meno che non si stia attraversando un fuso orario quando lo si utilizza, e dal momento che l'app ha come target solo la Spagna, non sono molto preoccupato per quel problema. – razielsarafan

+1

@ santirivera92: "Generato nell'app" non significa necessariamente "generato con lo stesso fuso orario", anche se sembra che sia il caso. Vorrei personalmente * almeno * inserire commenti in merito ... è il tipo di cosa che può facilmente essere trascurata quando i requisiti cambiano. –

1

La classe di calendario ha un metodo di confronto. Perché non lo chiami direttamente?

+1

Questo confronta la data * e l'ora * ... –

+0

hmm ... sì..non ho letto completamente la domanda –

40

ProvacompareTo

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

Returns:

il valore 0 se il tempo rappresentato dal argomento è uguale al tempo rappresentato da questo calendario; un valore inferiore a 0 se l'ora di questo calendario è precedente al tempo rappresentato dall'argomento; e un valore maggiore di 0 se l'ora di questo calendario è successiva all'ora rappresentata dall'argomento.

EDIT

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

È possibile utilizzare DateUtils.isSameDay per verificare se è lo stesso giorno.

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

28 Mar 2002 13:45 e 28 Mar 2002 06:01 restituirebbe vero. 28 Mar 2002 13:45 e 12 Mar 2002 13:45 restituirebbe falso.

+0

Ciò dirà che oggi alle 10 non è uguale alle 11 di oggi, a differenza del metodo dell'OP. L'OP è interessato solo alla * data *. –

+0

Grazie. La tua soluzione ha funzionato benissimo per me. +1 .. –

8

È possibile utilizzare somehing come 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

Per confrontare due date rispetto ad un campo specifico, primo set tutti i campi sottostanti che uno al valore più basso (che è 0 o 1 a seconda del campo) utilizzando Calendar.set (campo int, valore int) e quindi confronta. Per confrontare le differenze tra i giorni cal1 e cal2, imposterai MINUTO, SECONDO e MILLISECOND su entrambi gli oggetti su 0 prima di chiamare cal1.compare (cal2).