2009-10-01 22 views
14

E 'un modo valido di date di confronto:Devo usare Calendar.compareTo() per confrontare le date?

Calendar someCalendar1 = Calendar.getInstance(); // current date/time 
someCalendar1.add(Calendar.DATE, -14); 

Calendar someCalendar2 = Calendar.getInstance(); 
someCalendar2.setTime(someDate); // someDate is in the format of MM/dd/yyyy 

if(someCalendar2.compareTo(someCalendar1) < 0){ 
    ...Code...    
} 

... o c'è un approccio migliore?

risposta

17

Date implementa paragonabile per sé quindi non c'è alcun motivo per avvolgere in calendario:

Calendar someCalendar1 = Calendar.getInstance(); // current date/time 
someCalendar1.add(Calendar.DATE, -14); 

if (someDate.compareTo(someCalendar1.getTime()) < 0) { 
    ...Code...       
} 

Data ha anche convenienti after() e before() metodi che rendono il confronto di cui sopra più facile da leggere:

if (someDate.before(someCalendar1.getTime())) { 
    ...Code...       
} 

Infine, se si tratta di data/ora molto, considera l'utilizzo di Joda Time invece delle classi java integrate. E 'molto più conveniente e funzionale:

DateTime dt = new DateTime().minusWeeks(2); 
if (new DateTime(someDate).isBefore(dt)) { 
    ...Code...       
} 
+0

Grazie a un mucchio .. :) –

+0

Se si confronta Data, non si perdono tutti i dati del fuso orario e quindi si ottiene la risposta sbagliata a meno che entrambi i calendari si trovino nello stesso fuso orario? –

7

E' valida, ma tu sei un po 'confuso su someDate-Calendar.setTime prende una java.util.Date, che è solo un wrapper per un long che indica il numero di millisecondi trascorsi dalla mezzanotte 1 gennaio, 1970, UTC. Non è "nel formato MM/gg/aaaa" - questa è una rappresentazione di stringa, non una java.util.Date. Se capita di stampare qualcosa nel formato MM/dd/yyyy, questo è esattamente ciò che Date.toString sta facendo per te - non è intrinsecamente parte del formato.

Come parte, personalmente raccomando di evitare java.util.Date e java.util.Calendar completamente e utilizzare invece Joda Time. È una molto migliore API.

+0

+1 per differenza tra valore/formattazione – pmu

+0

Cool .. Grazie .. :) –

+0

+1 per raccomandare Joda Time! – spaaarky21

0

OK. Inoltre è possibile utilizzare prima() e dopo():

package demo.so; 

import java.util.Date; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

public class Tester { 

    public static void main(String[] args) throws Exception { 

    Calendar someCalendar1 = Calendar.getInstance(); // current date/time 
    someCalendar1.add(Calendar.DATE, -11); 

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
    Date someDate = df.parse("10/08/2009"); 

    Calendar someCalendar2 = Calendar.getInstance(); 
    someCalendar2.setTime(someDate); 

    String cal1 = df.format(someCalendar1.getTime()); 
    String cal2 = df.format(someCalendar2.getTime()); 

    if (someCalendar1.equals(someCalendar2)) 
     System.out.println(cal1 + " is the same as " + cal2); 
    if (someCalendar1.after(someCalendar2)) 
     System.out.println(cal1 + " is after " + cal2); 
    if (someCalendar1.before(someCalendar2)) 
     System.out.println(cal1 + " is before " + cal2); 

    } 

} 

Ma non si dovrebbe usare Data, è deprecato e una fonte di problemi con la manipolazione date. Costruisci il tuo wrapper per GregorianCalendar o usa qualche buona libreria, come Joda.

2

Come esempio del perché Joda è migliore, prendi l'ora legale.

Se si misura "un giorno" come 1000 * 60 * 60 * 24 millisecondi, la libreria Date - e la libreria Calendario - dimenticano entrambi che c'è un giorno nell'anno con 25 ore e un altro con 23. Occasionalmente si annullano i calcoli delle date se si fa affidamento esclusivamente sulle classi Java integrate nell'API J2SE.

Joda è probabilmente la sostituzione sostitutiva di GregorianCalendar, Calendar e Date in una versione futura di Java.

+0

JSR-310 non è esattamente la stessa di Joda, anche se è molto simile a causa dell'essere lanciati dalla stessa persona, ma non può arrivare abbastanza velocemente IMO. –