Tengo problemas con la clase Date en Java. La clase de fecha devuelve la fecha de la máquina local pero necesito UTC-0.
Busqué en Google y encontré una gran solución para JavaScript, pero para Java nada útil.
¿Cómo obtener la fecha UTC + 0 en Java 8?

java.util.Datenunca es una fecha de máquina local. Siempre se define como milisegundos transcurridos desde 1970-01-01 en relación con UTC + 00: 00. Tal vez el comportamiento de su método lotoString()confunda, ya que de hecho usa una representación en la zona horaria local.Respuestas:
Con Java 8 puedes escribir:
Para responder a su comentario, puede convertirlo en una Fecha (a menos que dependa del código heredado, no veo ninguna razón por la cual) o en milisegundos desde las épocas:
fuente
OffsetDateTimelugar deZonedDateTimedado que estamos trabajando con un simple desplazamiento de UTC en lugar de una zona horaria completa?tl; dr
java.time
Las problemáticas clases antiguas de fecha y hora incluidas con las primeras versiones de Java han sido suplantadas por las clases java.time integradas en Java 8 y posteriores. Consulte el tutorial de Oracle . Gran parte de la funcionalidad se ha actualizado a Java 6 y 7 en ThreeTen-Backport y se ha adaptado aún más a Android en ThreeTenABP .
InstantAn
Instantrepresenta un momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos .El
toStringmétodo genera un objeto String con texto que representa el valor de fecha y hora utilizando uno de los formatos estándar ISO 8601 .La
Instantclase es una clase básica de bloques de construcción en java.time. Esta debería ser su clase de referencia cuando maneje la fecha y hora, ya que generalmente la mejor práctica es rastrear, almacenar e intercambiar valores de fecha y hora en UTC.OffsetDateTimePero
Instanttiene limitaciones como no tener opciones de formato para generar cadenas en formatos alternativos. Para mayor flexibilidad, convierta deInstantaOffsetDateTime. Especifique un desplazamiento de UTC . En java.time eso significa unZoneOffsetobjeto. Aquí queremos seguir con UTC (+00) para poder usar la constante convenienteZoneOffset.UTC.O salte la
Instantclase.Ahora, con un
OffsetDateTimeobjeto en la mano, puede usarloDateTimeFormatterpara crear objetos String con texto en formatos alternativos. Busque Stack Overflow para ver muchos ejemplos de usoDateTimeFormatter.ZonedDateTimeCuando desee mostrar la hora del reloj de pared para una zona horaria en particular, aplique un
ZoneIdpara obtener unZonedDateTime.En este ejemplo, aplicamos la zona horaria de Montreal. En el verano, según la tontería del horario de verano (DST) , la zona tiene una compensación de
-04:00. Observe que la hora del día es cuatro horas antes en la salida, en15lugar de19horas.InstantyZonedDateTimeambos representan el mismo momento simultáneo, visto a través de dos lentes diferentes.Mudado
Si bien debe evitar las antiguas clases de fecha y hora, si es necesario, puede convertir utilizando nuevos métodos agregados a las antiguas clases. Aquí usamos
java.util.Date.from( Instant )yjava.util.Date::toInstant.Y yendo en la otra dirección.
De manera similar, busque nuevos métodos agregados a
GregorianCalendar(subclase deCalendar) para convertir ay desdejava.time.ZonedDateTime.Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date,Calendar, ySimpleDateFormat.Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan
java.sql.*clases. Hibernate 5 y JPA 2.2 admiten java.time .¿Dónde obtener las clases java.time?
fuente
ZonedDateTime¿no sería necesario ya que todosZoneIdse asignarían a unoZoneOffsetque podríamos usarOffsetDateTime?En java8, usaría la
Instantclase que ya está en UTC y es conveniente trabajar con ella.Alternativamente, puede utilizar lo siguiente:
De regreso
Instantfuente
Instantes a la hora local. Una , por definición, es en UTC. Por lo tanto, no es necesario que las maquinaciones que se ven en esta Respuesta intenten ingresar a UTC; el ya está en UTC. Vea mi respuesta para obtener más información y un código mucho más simple.InstantInstantEn Java8, usa la nueva API Time y convierte un Instant en un ZonedDateTime usando UTC TimeZone
fuente
Solución de 1 línea en Java 8:
fuente