new java date utc

java - new - ¿Cómo hacer que date.getTime() devuelva la hora UTC?



get utc time javascript (5)

getTime() devuelve "el número de milisegundos desde el 1 de enero de 1970, 00:00:00 GMT", nada más, nada menos (obviamente, tiene que crearlo correctamente). Puedes formatearlo como quieras, comenzando por ejemplo con el constructor GregorianCalendar(TimeZone) .

Tengo un objeto Date que representa una hora UTC. Cuando uso el método getTime () para obtener el valor largo de este objeto, el valor devuelto corresponde a nuestra hora local (EE. UU. Central). ¿Cuál es la forma correcta de recuperar el valor que corresponde a la hora UTC original?

Gracias



java.util.Date no tiene ningún concepto de zona horaria. Simplemente contiene el tiempo relativo a la época, que es el 1 de enero de 1970 a las 00:00:00 UTC. La fecha es un modelo, separado de la vista. Cuando visualiza la fecha, se aplica el concepto de zona horaria. Date''s toString () muestra una fecha de lectura humana en la zona horaria predeterminada. Puede usar un DateFormat para mostrar una fecha en una zona horaria diferente (como UTC) o cambiar la zona horaria predeterminada de la JVM.


tl; dr

Instant.now()

…y…

Instant.ofEpochMilli( n )

…y…

instant.toEpochMilli()

Date siempre está en UTC

Cuando uso el método getTime () para obtener el valor largo de este objeto, el valor devuelto corresponde a nuestra hora local (EE. UU. Central).

No, el valor devuelto por Date::getTime() siempre corresponde a UTC (prácticamente lo mismo que GMT en este contexto). Para citar el documento de la clase:

Devuelve la cantidad de milisegundos desde el 1 de enero de 1970 a las 00:00:00 GMT representada por este objeto Date.

Entonces su pregunta no tiene sentido porque una Date ya está en UTC. No es necesario "recuperar el valor que corresponde a la hora UTC original",

Puede confundir el comportamiento de getTime con el del método toString . El método toString aplica molesta y confusamente la zona horaria predeterminada actual en el proceso de generación de la Cadena. Por lo tanto, el resultado de la cadena aparece con una zona horaria, mientras que, de hecho, no hay una zona horaria que establecer o obtener a partir de la Date misma. (En realidad, hay una zona en la profundidad de la Date pero eso es irrelevante para esta discusión aquí. ¡Esta clase es un desastre confuso!)

java.time

La forma moderna de hacerlo es usar clases java.time.

Instant

La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).

Obtenga el momento actual.

Instant instant = Instant.now();

Puede convertir una Date en su reemplazo moderno llamando a uno de los nuevos métodos de conversión agregados a las antiguas clases de fecha y hora. Simplemente llama a toInstant , bastante fácil.

Instant instant = myJavaUtilDate.toInstant();

No recomiendo en absoluto el uso de un número de recuento de época como una forma de tiempo de seguimiento. Quédate con los objetos java.time en su lugar. Cuando esté fuera de Java, serialice para usar texto en los formatos ISO 8601 .

Pero si debe, puede extraer un conteo de milisegundos desde la época de 1970-01-01T00: 00: 00Z. Tenga en cuenta que esto puede implicar la pérdida de datos. Un Instant tiene una resolución más fina de nanosegundos. Así que ir a milisegundos puede disminuir una fracción de la fracción de segundo.

long millisecondsSinceEpoch = instant.toEpochMilli(); // Caution: Possible data-loss in going from nanoseconds to milliseconds.

Yendo en la otra dirección, de un conteo a un Instant .

Instant instant = Instant.ofEpochMilli( millisecondsSinceEpoch ) ;

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
    • Vea Cómo usar ...

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .


LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); Instant instant = now.atZone(ZoneId.systemDefault()).toInstant(); Date formattedDate = Date.from(instant); return formattedDate;