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.Date
nunca 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
OffsetDateTime
lugar deZonedDateTime
dado 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 .
Instant
An
Instant
representa un momento en la línea de tiempo en UTC con una resolución de hasta nanosegundos .El
toString
mé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
Instant
clase 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.OffsetDateTime
Pero
Instant
tiene limitaciones como no tener opciones de formato para generar cadenas en formatos alternativos. Para mayor flexibilidad, convierta deInstant
aOffsetDateTime
. Especifique un desplazamiento de UTC . En java.time eso significa unZoneOffset
objeto. Aquí queremos seguir con UTC (+00) para poder usar la constante convenienteZoneOffset.UTC
.O salte la
Instant
clase.Ahora, con un
OffsetDateTime
objeto en la mano, puede usarloDateTimeFormatter
para crear objetos String con texto en formatos alternativos. Busque Stack Overflow para ver muchos ejemplos de usoDateTimeFormatter
.ZonedDateTime
Cuando desee mostrar la hora del reloj de pared para una zona horaria en particular, aplique un
ZoneId
para 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, en15
lugar de19
horas.Instant
yZonedDateTime
ambos 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 todosZoneId
se asignarían a unoZoneOffset
que podríamos usarOffsetDateTime
?En java8, usaría la
Instant
clase que ya está en UTC y es conveniente trabajar con ella.Alternativamente, puede utilizar lo siguiente:
De regreso
Instant
fuente
Instant
es 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.Instant
Instant
En 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