ZoneOffset em Java

ZoneOffset em Java

1. Introdução

Em nosso mundo, cada país segue um determinado fuso horário. Esses fusos horários são cruciais para expressar a hora de maneira conveniente e eficaz. No entanto, os fusos horários às vezes podem ser inexplicáveis ​​devido a variáveis ​​como o horário de verão, que aparecem na imagem.

Além disso, enquanto representa esses fusos horários no nosso código, as coisas podem ficar confusas. Java forneceu várias classes, comoDate,TimeeDateTime no passado para cuidar também dos fusos horários.

No entanto, novas versões do Java surgiram com classes mais úteis e expressivas, comoZoneIdeZoneOffset, para gerenciar fusos horários.

Neste artigo,we’ll discuss ZoneId and ZoneOffset as well as related DateTime classes.

Também podemos ler sobre o novo conjunto de classesDateTime introduzido no Java 8, em nossoprevious post.

2. ZoneId eZoneOffset

Com o advento deJSR-310, algumas APIs úteis foram adicionadas para gerenciar data, hora e fusos horários. As classesZoneIdeZoneOffset também foram adicionadas como parte desta atualização.

2.1. ZoneId

Como afirmado acima,ZoneId is a representation of the time-zone, como ‘Europe/Paris’.

Existem 2 implementações deZoneId. Primeiro, com um deslocamento fixo em comparação com GMT / UTC. E segundo, como uma região geográfica, que possui um conjunto de regras para calcular a compensação com GMT / UTC.

Vamos criar umZoneId para Berlim, Alemanha:

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

2.2. ZoneOffset

ZoneOffset extends ZoneId anddefinesthe fixed offset of the current time-zone with GMT/UTC, como +02: 00.

Isso significa que esse número representa horas e minutos fixos, representando a diferença entre a hora no fuso horário atual e GMT / UTC:

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

In case a country has 2 different offsets – in summer and winter, there will be 2 different ZoneOffset implementations for the same region, hence the need to specify a LocalDateTime.

3. DateTime aulas

A seguir, vamos discutir algumas classes deDateTime, que realmente tiram vantagem deZoneIdeZoneOffset.

3.1. ZonedDateTime

ZonedDateTime é uma representação imutável de uma data e hora com um fuso horário no sistema de calendário ISO-8601, como2007-12-03T10:15:30+01:00 Europe/Paris. ZonedDateTime holds state equivalent to three separate objects, a LocalDateTime, a ZoneId and the resolved ZoneOffset

Esta classe armazena todos os campos de data e hora, com uma precisão de nanossegundos, e um fuso horário, comZoneOffset, para lidar com datas-horas locais ambíguas. Por exemplo,ZonedDateTime pode armazenar o valor “2 de outubro de 2007 às 13: 45.30.123456789 +02: 00 no fuso horário da Europa / Paris”.

Vamos obter oZonedDateTime atual para a região anterior:

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

ZonedDateTime also fornece funções embutidas, para converter uma determinada data de um fuso horário para outro:

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTime

OffsetDateTime é uma representação imutável de uma data e hora com um deslocamento no sistema de calendário ISO-8601, como2007-12-03T10:15:30+01:00.

This class stores all date and time fields, to a precision of nanoseconds, as well as the offset from GMT/UTC. Por exemplo,OffsetDateTime pode armazenar o valor “2 de outubro de 2007 às 13: 45.30.123456789 +02: 00”.

Vamos obter aOffsetDateTime atual com 2 horas de diferença do GMT / UTC:

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

3.3. OffsetTime

OffsetTime é um objeto data-hora imutável que representa um tempo, geralmente visto como hora-minuto-segundo-deslocamento, no sistema de calendário ISO-8601, como10:15:30+01:00.

This class stores all time fields, to a precision of nanoseconds, as well as a zone offset. Por exemplo,OffsetTime pode armazenar o valor “13: 45.30.123456789 + 02: 00”.

Vamos obter aOffsetTime atual com 2 horas de deslocamento:

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

4. Conclusão

Voltando ao ponto focal,ZoneOffset é uma representação do fuso horário em termos da diferença entre GMT / UTC e a hora fornecida. Essa é uma maneira prática de representar o fuso horário, embora existam outras representações também disponíveis.

Além disso,ZoneIdeZoneOffset não são usados ​​apenas independentemente, mas também por certas classes JavaDateTime, comoZonedDateTime,OffsetDateTime eOffsetTime.

Como de costume, o código está disponível em nossoGitHub repository.