ZonedDateTime
não parece permitir detectar se a data dada é uma lacuna DST ou sobreposição. Os médicos dizem para o of
método (a criação de um ZonedDateTime
):
No caso de uma sobreposição, quando os relógios são ajustados para trás, há duas compensações válidos. Este método usa o anteriormente compensados normalmente correspondente a "verão".
No caso de uma lacuna, quando os relógios saltar para a frente, não há deslocamento válido. Em vez disso, a data-hora local é ajustada para ser mais tarde pelo comprimento da lacuna.
^ Como lido anteriormente, este método irá retornar apenas um valor, mas não me permite saber se uma lacuna DST ou sobreposição ocorre.
Gostaria de saber se a data prevista é uma lacuna ou sobreposição, e tem a data de início e término da lacuna ou sobreposição.
Por exemplo:
"1920/09/01 00:10" para o fuso horário "África / Accra" está em uma lacuna DST .
A diferença é a partir de "1920/09/01 00: 00: 00 + 00: 00" para "1920/09/01 00: 20: 00 + 00: 20" .
"1920/12/30 23:50" para o fuso horário "África / Accra" está em uma sobreposição DST .
As preocupações de sobreposição dos períodos:
"1920/12/30 23: 40: 00 + 00: 20" para "1920/12/31 00: 00: 00 + 00: 20" e
"1920/12/30 23:40: 00 + 00: 00" para "1920/12/31 00: 00: 00 + 00: 00"
Como posso obter essas datas, no caso de uma lacuna ou sobreposição como nos exemplos acima?
Eu não acho que isso é fisicamente possível para criar uma ZonedDateTime
que está em uma transição lacuna, porque os tempos data local que uma transição lacuna pula são tecnicamente "inexistente", e ZonedDateTime
é bastante rigoroso sobre isso. Dependendo do seu método, ele quer lançar uma exceção ou ajustar a um tempo que existe.
Você deve fazer essa verificação com LocalDateTime
s, não ZonedDateTime
é.
ZoneRules
tem este método muito conveniente chamada getTransition
que leva um LocalDateTime
e dá-lhe uma ZoneOffsetTransition
, o que representa uma transição lacuna / sobreposição, ou null
se esse tempo de data não tem uma transição. Exemplo:
System.out.println(ZoneId.of("Africa/Accra").getRules()
.getTransition(LocalDateTime.of(1920, 9, 1, 00, 10)));
Resultado:
Transition[Gap at 1920-09-01T00:00Z to +00:20]
Você pode, então, obter todas as informações que você quer (início, fim, compensado antes, compensado depois, lacuna / sobreposição etc) a partir do ZoneOffsetTransition
objeto.