Diferenças entre ZonedDateTime e OffsetDateTime
1. Visão geral
ZonedDateTimeeOffsetDateTime são classes bastante populares emhttps://www.example.com/java-8-date-time-intro. Além disso,both store an instant on the timeline up to a precision of nanoseconds. E, a princípio, pode ficar confuso escolher entre elas.
Neste tutorial rápido, vamos dar uma olhada nas diferenças entreZonedDateTime eOffsetDateTime.
2. ZonedDateTime
UmZonedDateTime é 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. It holds state equivalent to three separate objects: a LocalDateTime, a ZoneId, and the resolved ZoneOffset.
Aqui, oZoneId determina como e quando o deslocamento muda. Portanto, o deslocamento não pode ser definido livremente, pois a zona controla quais deslocamentos são válidos.
Para obter oZonedDateTime atual para uma região específica, usaremos:
ZoneId zone = ZoneId.of("Europe/Berlin");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zone);
A classeZonedDateTime também fornece métodos integrados para converter uma determinada data de um fuso horário para outro:
ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);
Por fim, éfully DST-aware and handles daylight saving time adjustments. Muitas vezes é útil quando queremos exibir um campo de data e hora em um fuso horário específico.
3. OffsetDateTime
UmOffsetDateTime é uma representação imutável de uma data-hora com um deslocamento de UTC / Greenwich no sistema de calendário ISO-8601, como2007-12-03T10:15:30+01:00. Em outras palavras,it storesall date and time fields, to a precision of nanoseconds, as well as the offset from GMT/UTC.
Vamos obter aOffsetDateTime atual com uma diferença de duas horas do GMT / UTC:
ZoneOffset zoneOffSet= ZoneOffset.of("+02:00");
OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffSet);
4. As principais diferenças
Primeiro, não faz sentido (sem conversões) comparar diretamente duas datas com informações de fuso horário completo. Portanto,we should always prefer storing OffsetDateTime in the database over the ZonedDateTime, as dates with a local time offset always represent the same instants in time.
Além disso, ao contrário deZonedDateTime, adicionar um índice sobre uma coluna que armazenaOffsetDateTime não mudará o significado da data.
Vamos resumir rapidamente as principais diferenças.
ZonedDateTime:
-
armazena todos os campos de data e hora, com precisão de nanossegundos e um fuso horário, com um deslocamento de zona usado para manipular datas locais ambíguas
-
não pode definir deslocamentos livremente, pois a zona controla os valores de deslocamento válidos
-
é totalmente compatível com DST e lida com ajustes de horário de verão
-
é útil para exibir campos de data e hora em um fuso horário específico do usuário
OffsetDateTime :
-
armazena todos os campos de data e hora, com precisão de nanossegundos, bem como o deslocamento de GMT / UTC (sem informações de fuso horário)
-
deve ser usado para armazenar uma data no banco de dados ou comunicá-la através de uma rede
5. Conclusão
Neste tutorial, cobrimos as diferenças entreZonedDateTimeeOffsetDateTime.
Como de costume, o código-fonte completo está disponívelover on Github.