2008-11-04 29 views
8

Programa seguido de salida. Alguien por favor me explique porqué 10,000,000 de milisegundos desde el 1 de enero de 1970 es el 31 de noviembre de 1969. Bueno, alguien por favor explique qué pasa con mi suposición de que la primera prueba debería producir un tiempo de 10,000,000 de milisegundos desde el 1 de enero de 1970. Números menores de 10,000,000 producen el mismo resultadoJava.util.Calendar - milisegundos desde el 1 de enero de 1970

public static void main(String[] args) { 

    String x = "10000000"; 
    long l = new Long(x).longValue(); 
    System.out.println("Long value: " + l); 

    Calendar c = new GregorianCalendar(); 
    c.setTimeInMillis(l); 
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis()); 

    String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH); 
    System.out.println("Date in YYYY-MM-DD format: " + origDate); 

    x = "1000000000000"; 
    l = new Long(x).longValue(); 
    System.out.println("\nLong value: " + l); 

    c.setTimeInMillis(l); 
    System.out.println("Calendar time in Millis: " + c.getTimeInMillis()); 

    origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH); 
    System.out.println("Date in YYYY-MM-DD format: " + origDate); 
} 

Valor de larga: 10000000

tiempo Calendario de Millis: 10000000

Fecha en formato AAAA-MM-DD formato: 1969-11-31

Valor de larga: 1000000000000

Horas de calendario en Millis: 1000000000000

Fecha en formato AAAA-MM-DD: 2001-8-8

Respuesta

12

Las fechas se imprime desde Calendar son locales a la zona horaria , mientras que la época se define como la medianoche de 1970-01-01 en UTC. Por lo tanto, si vive en una zona horaria al oeste de UTC, su fecha aparecerá como 1969-12-31, aunque (en UTC) todavía es 1970-01-01.

+2

Gracias! Pensé que me estaba volviendo loco. –

0

se puede averiguar a sí mismo si cambia su primera c.setTimeInMillis(l); en c.clear();

6

En primer lugar, c.get (Calendar.MONTH) devuelve 0 para enero, 1 de feb etc.

En segundo lugar, el uso DateFormat a las fechas de salida.

En tercer lugar, sus problemas son un gran ejemplo de lo incómoda que es la API de fecha de Java. Use Joda Time API si puede. Hará tu vida algo más fácil.

Aquí hay un ejemplo mejor de su código, lo que indica la zona horaria:

public static void main(String[] args) { 

    final DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 

    long l = 10000000L; 
    System.out.println("Long value: " + l); 
    Calendar c = new GregorianCalendar(); 
    c.setTimeInMillis(l); 
    System.out.println("Date: " + dateFormat.format(c.getTime())); 

    l = 1000000000000L; 
    System.out.println("\nLong value: " + l); 
    c.setTimeInMillis(l); 
    System.out.println("Date: " + dateFormat.format(c.getTime())); 
} 
+0

Muy útil; usted respondió mi pregunta un poco indirectamente. La cosa de la zona horaria me causaba la mayor confusión.El código mejorado es muy apreciado. –

5

Calendar#setTimeInMillis() establece el tiempo del calendario para el número de milisegundos después del 1 de Ene, 1970 GMT.

Calendar#get() devuelve el campo solicitado ajustado para la zona horaria del calendario que, de forma predeterminada, es la zona horaria local de su máquina.

Esto debería funcionar como se espera si se especifica zona horaria "GMT" al construir el calendario:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT")); 
+0

Gracias por el ejemplo de código. –

1

Su zona horaria es más probable que la zaga GMT (por ejemplo, GMT-5), por lo tanto, a partir 10,000,000ms epoch es el 31 de diciembre de 1969 en su zona horaria, pero dado que los meses se basan en cero en java.util.Calendar, su conversión de Calendario-> texto es defectuosa y obtiene 1969-11-31 en lugar del esperado 1969-12-31.

3

Lamentablemente, java.util.Date y java.util.Calendar fueron mal diseñados dando lugar a este tipo de confusión.

Cuestiones relacionadas