Java — Corrigindo horário de verão

O Horário de verão foi extinto em 2019 no brasil, e como causa diversas aplicações tiveram o impacto de adiantar uma hora e alterar o timezone de acordo com o antigo horário de verão.

A imagem a seguir demonstra o horário de verão em todas as regiões do Brasil.

Horário de verão

Note que São Paulo possui UTC-2 em horário de verão, e UTC-3 em horário normal. Um dos problemas que acaba surgindo é que as aplicações Java tem um mecanismo de DST (Daylight Saving Time) próprio.

O Daylight Saving Time muda muito frequentemente pelo mundo, e não há nenhuma autoridade central que coordena as mudanças. Atualmente, sempre que existe uma mudança, ela é registrada no IANA TIMEZONE DATABASE. Em seguida, a próxima atualização do JRE do Java conterá as atualizações realizadas.

O processo a seguir serve para agilizar o processo e fazer as aplicações Java começarem a retornar as datas em formato correto:

Passo 1

Primeiramente iremos acessar o site https://www.iana.org/time-zones e realizar o download do arquivo tar.gz (382.9kb) Data Only Distribution.

Passo 2

Em sequencia iremos acessar o site https://www.oracle.com/technetwork/java/javase/downloads/tzupdater-download-513681.html e realizar o download da ferramenta da Oracle que permite realizar o ajuste dos horários.

Passo 3

Em seguida, no Windows, baixar o 7-Zip pelo seguinte Link: https://www.7-zip.org/download.html. Iremos editar os dados fornecidos pelo Database de Timezones do Iana.

Passo 4

Logo em seguida, iremos abrir o arquivo southamerica presente no arquivo tzdata2019c.tar.gz.

Passo 5

Iremos acessar a Zone America/Sao_Paulo. (Atual linha 1034). A estrutura é a seguinte:

Portanto, ela possui o seguinte formato: ZONE, NAME, STDOFF, RULES, FORMAT, [UNTIL].

Um exemplo de atualização que pode ser utilizada:

Foram realizadas mais algumas modificações nas seguintes linhas:

modificacao

Iremos atualizar também os outros estados que necessitam de modificações (basta verificar alguns estados abaixo do de São Paulo). Não se deve realizar nenhuma alteração seguindo a risca as regras propostas pela IANA.

Passo 6

Agora, iremos utilizar a ferramenta da Oracle, que é um arquivo .jar. Iremos executar o seguinte comando:

java -jar tzupdater.jar -f -l file:///home/caminho/tzdata.tar.gz

O arquivo tzdata.tar.gz deve conter o arquivo southamerica atualizado.

Após a execução, devemos ter o seguinte retorno:

Using file:///home/caminho/tzupdater/tzdata/tzdata.tar.gz as source for tzdata bundle.

Passo 7

Em seguida, na instancia da AWS iremos reiniciar o ambiente.

Quando o ambiente for reinicializado, iremos checar as alterações a partir do exemplo de código a seguir:

ZoneId fusoHorarioDeSaoPaulo = ZoneId.of(“America/Sao_Paulo”);
ZonedDateTime agoraEmSaoPaulo = ZonedDateTime.now(fusoHorarioDeSaoPaulo);
System.out.println(agoraEmSaoPaulo); //2019–10–21T10:02:57.838–03:00[America/Sao_Paulo]

Passo 8

Em conclusão, tudo deve estar funcionando corretamente! É uma alteração as pressas visando remediar a situação.

Portanto até a próxima atualização do JRE, este é um mecanismo que iremos utilizar para resolver o problema com urgência.

A seguir, para acessar mais conteúdos como esse, clique aqui.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima