ZoneOffset en Java

1. Introducción

En nuestro mundo, cada país sigue una determinada zona horaria. Estas zonas horarias son cruciales para expresar la hora de manera conveniente y eficaz. Sin embargo, las zonas horarias a veces pueden ser inexplicables debido a variables como el horario de verano, que entran en escena.

Además, al representar estas zonas horarias en nuestro código, las cosas pueden volverse confusas. Java ha proporcionado varias clases como Date , Time y DateTime en el pasado para cuidar también de las zonas horarias.

Sin embargo, las nuevas versiones de Java han presentado clases más útiles y expresivas, como ZoneId y ZoneOffset , para administrar zonas horarias.

En este artículo, analizaremos ZoneId y ZoneOffset , así como las clases DateTime relacionadas .

También podemos leer sobre el nuevo conjunto de clases DateTime introducido en Java 8, en nuestra publicación anterior.

2. ZoneId y ZoneOffset

Con la llegada de JSR-310, se agregaron algunas API útiles para administrar la fecha, la hora y las zonas horarias. Las clases ZoneId y ZoneOffset también se agregaron como parte de esta actualización.

2.1. ZoneId

Como se indicó anteriormente, ZoneId es una representación de la zona horaria como ' Europa / París '.

Hay 2 implementaciones de ZoneId . Primero, con un desplazamiento fijo en comparación con GMT / UTC. Y segundo, como región geográfica, que tiene un conjunto de reglas para calcular el desplazamiento con GMT / UTC.

Creemos un ZoneId para Berlín, Alemania:

ZoneId zone = ZoneId.of("Europe/Berlin");

2.2. ZoneOffset

ZoneOffset extiende ZoneId y define el desplazamiento fijo de la zona horaria actual con GMT / UTC , como +02: 00.

Esto significa que este número representa horas y minutos fijos, lo que representa la diferencia entre la hora en la zona horaria actual y GMT / UTC:

LocalDateTime now = LocalDateTime.now(); ZoneId zone = ZoneId.of("Europe/Berlin"); ZoneOffset zoneOffSet = zone.getRules().getOffset(now);

En caso de que un país tenga 2 compensaciones diferentes, en verano e invierno, habrá 2 implementaciones de ZoneOffset diferentes para la misma región, de ahí la necesidad de especificar un LocalDateTime .

3. Clases de fecha y hora

A continuación, analicemos algunas clases DateTime , que realmente aprovechan ZoneId y ZoneOffset .

3.1. ZonedDateTime

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. Un ZonedDateTime contiene un estado equivalente a tres objetos separados, un LocalDateTime , un ZoneId y el ZoneOffset resuelto .

Esta clase almacena todos los campos de fecha y hora, con una precisión de nanosegundos, y una zona horaria, con un ZoneOffset , para manejar fechas y horas locales ambiguas. Por ejemplo, ZonedDateTime puede almacenar el valor "2 de octubre de 2007 a las 13: 45.30.123456789 +02: 00 en la zona horaria de Europa / París".

Consigamos el ZonedDateTime actual para la región anterior:

ZoneId zone = ZoneId.of("Europe/Berlin"); ZonedDateTime date = ZonedDateTime.now(zone);

ZonedDateTime también proporciona funciones integradas para convertir una fecha determinada de una zona horaria a otra:

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTime

OffsetDateTime es una representación inmutable de una fecha y hora con un desplazamiento en el sistema de calendario ISO-8601, como 2007-12-03T10: 15: 30 + 01: 00 .

Esta clase almacena todos los campos de fecha y hora, con una precisión de nanosegundos, así como el desplazamiento de GMT / UTC . Por ejemplo, OffsetDateTime puede almacenar el valor "2 de octubre de 2007 a las 13: 45.30.123456789 +02: 00".

Obtengamos el OffsetDateTime actual con 2 horas de compensación de GMT / UTC:

ZoneOffset zoneOffSet= ZoneOffset.of("+02:00"); OffsetDateTime date = OffsetDateTime.now(zoneOffSet);

3.3. OffsetTime

OffsetTime es un objeto de fecha-hora inmutable que representa una hora, a menudo vista como compensación de hora-minuto-segundo, en el sistema de calendario ISO-8601, como 10: 15: 30 + 01: 00 .

Esta clase almacena todos los campos de tiempo, con una precisión de nanosegundos, así como un desplazamiento de zona . Por ejemplo, OffsetTime puede almacenar el valor "13: 45.30.123456789 + 02: 00".

Consigamos el OffsetTime actualcon 2 horas de compensación:

ZoneOffset zoneOffSet = ZoneOffset.of("+02:00"); OffsetTime time = OffsetTime.now(zoneOffSet);

4. Conclusión

Volviendo al punto focal, ZoneOffset es una representación de la zona horaria en términos de la diferencia entre GMT / UTC y la hora dada. Esta es una forma práctica de representar la zona horaria, aunque también hay otras representaciones disponibles.

Además, ZoneId y ZoneOffset no solo se usan de forma independiente, sino también por ciertas clases de Java DateTime como ZonedDateTime , OffsetDateTime y OffsetTime .

Como de costumbre, el código está disponible en nuestro repositorio de GitHub.