online example dates create java datetime timezone jodatime

java - example - jodatime online



Tiempo de conversión de tiempo de conversión Jodatime a millis (1)

¿Puede alguien explicarme por qué cuando trato de obtener los milisegundos de un DateTime con una zona diferente a la mía, me devuelve los milisegundos de la zona horaria de mi máquina local? Estoy buscando los milisegundos de UTC, pero mi configuración local de la aplicación está configurada en EST (aunque en realidad estoy en Irlanda;))

Aquí está el código:

DateTimeFormatter format = DateTimeFormat.mediumDateTime(); DateTime local = new DateTime(); DateTime utc = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC); System.out.println("utc zone = " +utc.getZone()); System.out.println("UTC time: " + utc); long current = utc.getMillis(); System.out.println("current: " + format.print(current)); System.out.println("local: " + format.print(local.getMillis()));

Esto es lo que imprime:

utc zone = UTC UTC time: 2013-08-16T13:36:32.444Z current: Aug 16, 2013 9:36:32 AM local: Aug 16, 2013 9:36:32 AM

Actualmente, ¿habría pensado que debería tener la misma fecha y hora que la hora UTC?


Algunos puntos:

  • No necesita llamar a System.currentTimeMillis() . Solo pasa esto:

DateTime utc = new DateTime(DateTimeZone.UTC);

  • Cuando llama a .getMillis() el resultado siempre está en UTC. Representar el tiempo como un número entero que no está basado en UTC es una mala idea, y no algo que Joda Time proporcionará. Su evaluación de que los milisegundos se ven afectados por su zona horaria local es incorrecta.

  • Los errores de conversión se deben a la forma en que está llamando a format.print . Cuando pasa un número entero, el comportamiento predeterminado es usar la zona horaria actual, que es su hora local. Puedes cambiarlo así:

format.withZone(DateTimeZone.UTC).print(current)

  • Sin embargo, si la intención es imprimirlo como una cadena de fecha, ¿por qué pasar primero a milisegundos? Si pasa el DateTime original, su información de zona horaria se aplicará automáticamente.

format.print(utc) format.print(local)

Juntos, todo se vería así:

DateTime local = new DateTime(); DateTime utc = new DateTime(DateTimeZone.UTC); System.out.println("local zone = " + local.getZone()); System.out.println(" utc zone = " + utc.getZone()); DateTimeFormatter format = DateTimeFormat.mediumDateTime(); System.out.println(" local: " + format.print(local)); System.out.println(" utc: " + format.print(utc)); System.out.println("millis: " + utc.getMillis());