2011-02-02 12 views
6

Estoy tratando de calcular una diferencia de tiempo fecha, pero estoy consiguiendo algunos resultados extraños: Aquí está la fuente:java rompecabezas diferencia de fechas

import java.util.Calendar; 
    import java.util.Collections; 
    import java.util.Vector; 

    public class Main { 

     static Calendar dcal = Calendar.getInstance(); 
    static Calendar ccal = Calendar.getInstance(); 
    public static void main(String[] args) { 
     dcal.set(2011, 1, 27); 
     ccal.set(2011,2,1); 
     long dtime = dcal.getTimeInMillis(); 
     long ctime = ccal.getTimeInMillis(); 
     long diff = ctime - dtime; 
     int hours = (int) (diff/(1000 * 60 * 60)); 
     System.out.println("hours->"+hours); 

    } 

} 

Cuando me puse a ccal 1 31 2011 la diferencia es la fecha 96 horas pero cuando lo configuro en 2 1 2011 la diferencia de fecha es de 48 horas. ¿Cómo puede ser esto? ¿Cuál es el remedio?

Gracias,

Elliott

Respuesta

6

Si está configurando ccal como tal "ccal.set(2011, 1, 31)" la fecha es realidad 3 de marzo de 2001 ya meses son cero en base y los rollos de calendario por defecto. Entonces la diferencia de 48 horas (96-48) es correcta porque hay dos días entre el 1 de marzo (set(2011,2,1)) y el 3 de marzo (set(2011,1,31)).

+0

Gracias por la información sobre el calendario en curso por defecto. –

4

Usted sabe que son meses 0 basada, ¿verdad? Entonces, 0 representa enero y 1 representa febrero, por lo que 1 31 2011 no existe. De hecho, es mejor no usar números en absoluto, sino usar las constantes de Calendar para los meses, es decir: Calendar.JANUARY. Para ver por sí mismo lo que está pasando, imprimir respectiva fecha de su calendario:

ccal.set(2011, 1, 31); 
    System.out.println(ccal.getTime()); 
+0

Lo sé, pero no explica el resultado – Elliott

+3

Creo que sí. Como el 31 de diciembre de 2011 no existe, suceden cosas inesperadas. Nuevamente, imprima la Fecha como mencioné en la edición de mi respuesta. –

+1

No, no es inesperado. Perfectamente bien documentado. – dty