1. Información general
ZonedDateTime y OffsetDateTime son clases bastante populares en la API de Java 8 DateTime . Además, ambos almacenan un instante en la línea de tiempo con una precisión de nanosegundos . Y, al principio, puede resultar confuso elegir entre ellos.
En este tutorial rápido, veremos las diferencias entre ZonedDateTime y OffsetDateTime .
2. ZonedDateTime
Un ZonedDateTime es una representación inmutable de una fecha y hora con una zona horaria en el sistema de calendario ISO-8601, como 2007-12-03T10: 15: 30 + 01: 00 Europe / Pari s. Tiene un estado equivalente a tres objetos separados: LocalDateTime , ZoneId y ZoneOffset resuelto .
Aquí, ZoneId determina cómo y cuándo cambia el desplazamiento. Por lo tanto, la compensación no se puede establecer libremente, ya que la zona controla qué compensaciones son válidas.
Para obtener el ZonedDateTime actual para una región específica, usaremos:
ZoneId zone = ZoneId.of("Europe/Berlin"); ZonedDateTime zonedDateTime = ZonedDateTime.now(zone);
La clase ZonedDateTime también proporciona métodos integrados para convertir una fecha determinada de una zona horaria a otra:
ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);
Finalmente, es totalmente compatible con DST y maneja los ajustes del horario de verano. A menudo resulta útil cuando queremos mostrar un campo de fecha y hora en una zona horaria específica.
3. OffsetDateTime
Un OffsetDateTime es una representación inmutable de una fecha y hora con un desfase de UTC / Greenwich en el sistema de calendario ISO-8601, como 2007-12-03T10: 15: 30 + 01: 00 . En otras palabras, almacena todos los campos de fecha y hora, con una precisión de nanosegundos, así como el desplazamiento de GMT / UTC .
Consigamos el OffsetDateTime actual con un desplazamiento de dos horas de GMT / UTC:
ZoneOffset zoneOffSet= ZoneOffset.of("+02:00"); OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffSet);
4. Las principales diferencias
Primero, no tiene sentido (sin conversiones) comparar directamente dos fechas con información completa de la zona horaria. Por lo tanto, siempre deberíamos preferir almacenar OffsetDateTime en la base de datos sobre ZonedDateTime , ya que las fechas con un desplazamiento de hora local siempre representan los mismos instantes en el tiempo.
Además, a diferencia de ZonedDateTime , agregar un índice sobre una columna que almacena OffsetDateTime no cambiará el significado de la fecha.
Resumamos rápidamente las diferencias clave.
ZonedDateTime :
- almacena todos los campos de fecha y hora, con una precisión de nanosegundos, y una zona horaria, con un desplazamiento de zona utilizado para manejar fechas y horas locales ambiguas
- no se pueden establecer compensaciones libremente, ya que la zona controla los valores de compensación válidos
- es totalmente consciente del horario de verano y maneja los ajustes de horario de verano
- resulta útil para mostrar campos de fecha y hora en una zona horaria específica del usuario
OffsetDateTime :
- almacena todos los campos de fecha y hora, con una precisión de nanosegundos, así como el desplazamiento de GMT / UTC (sin información de zona horaria)
- debe usarse para almacenar una fecha en la base de datos o comunicarla a través de una red
5. Conclusión
En este tutorial, cubrimos las diferencias entre ZonedDateTime y OffsetDateTime .
Como de costumbre, el código fuente completo está disponible en Github.