util uso tipo paquete milisegundos libreria hora gregorian fecha año java calendar

uso - tipo calendar en java



Java.util.Calendar-milisegundos desde el 1 de enero de 1970 (6)

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 resultado

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 largo: 10000000

Horario del calendario en Millis: 10000000

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

Valor largo: 1000000000000

Hora del calendario en Millis: 1000000000000

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


Las fechas que imprime desde el Calendar son locales a su zona horaria, mientras que el período 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.


Puede averiguar si cambia su primer c.setTimeInMillis(l); en c.clear();


Calendar # setTimeInMillis () establece el tiempo del calendario en la cantidad de milisegundos posteriores al 1 de enero de 1970 GMT .

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

Esto debería funcionar como espera si especifica la zona horaria "GMT" cuando construye el calendario:

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


Es probable que su zona horaria esté por detrás de GMT (por ejemplo, GMT-5), por lo tanto, 10.000,000ms de epoch es 31 de diciembre de 1969 en su zona horaria, pero dado que los meses tienen base cero en java.util.Calendar su conversión de Calendario-> texto está defectuosa y se obtiene 1969-11-31 en lugar del esperado 1969-12-31.


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


Primero, c.get (Calendar.MONTH) devuelve 0 para enero, 1 para febrero, etc.

Segundo, use DateFormat para 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 mejor ejemplo de tu código, 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())); }