Executando verificação de segurança...
0

Problema com Defasagem de Uma Hora na JVM

O Brasil enfrenta um problema com o fuso horário devido à falta de horário de verão. Em alguns casos, a JVM (Java Virtual Machine) ainda está utilizando o horário de verão, o que tem causado diferenças de uma hora em relação ao horário real.

O horário de verão é um ajuste no relógio que é adotado em alguns países durante o verão para aproveitar melhor a luz do dia. No Brasil, o horário de verão foi suspenso em 2020 e, desde então, o país tem enfrentado problemas com o fuso horário.

Um dos problemas é que, em alguns casos, a JVM ainda está utilizando o fuso horário America/São Paulo, que inclui o horário de verão. Isso tem causado diferenças de uma hora em relação ao horário real, o que pode ser um problema para aplicativos que dependem de horários precisos.

Para resolver esse problema, é recomendado utilizar o fuso horário GMT-3, que não inclui o horário de verão. Dessa forma, não haverá diferenças de horário e os aplicativos continuarão a funcionar de forma precisa.

É importante lembrar que essa é apenas uma solução temporária e que o problema deve ser resolvido de maneira mais definitiva pelas autoridades competentes. Enquanto isso, é recomendado que os desenvolvedores verifiquem qual fuso horário estão utilizando em seus aplicativos e, se for o caso, mudem para o fuso horário GMT-3 para evitar problemas.

A solução técnica seria utilizar a seguinte linha para obter a hora atual:

LocalTime horaAtual = LocalTime.now(ZoneId.of("GMT-3"));

Caso utilizem a linha abaixo, ocorrerá a diferença de uma hora na hora capturada:

LocalTime horaAtual = LocalTime.now(ZoneId.of("America/São_Paulo"));

Até mais pessoal!

Carregando publicação patrocinada...
1

Para resolver esse problema, é recomendado utilizar o fuso horário GMT-3

Não, a solução é atualizar a JVM para que ela tenhas as novas regras. Ou, se você está em uma região que não usa as mesmas regras de São Paulo, mudar para um idenfificador mais apropriado (por exemplo, America/Recife, America/Cuiaba, etc, a lista é grande).

O problema de usar um valor fixo como GMT-3 é que se um dia as regras mudarem de novo (o horário de verão pode voltar, por exemplo), aí vc vai ter que alterar novamente seu sistema.

Já usando o identificador apropriado (America/...), basta atualizar a JVM que ele já pegará as novas regras. Basta você usar o Timezone Updater Tool, que ele puxará a versão mais atualizada do Timezone Database e pronto, vc não precisa mudar nada no código.

1
1

Bom, meu argumento pra convencer as pessoas a atualizar costumava ser algo do tipo "As opções são: gambiarra que vai precisar mudar de novo no futuro, ou JVM atualizada e nem precisa mudar o código".

Vc ainda pode complementar dizendo que o horário de verão no Brasil sempre muda na madrugada de sábado pra domingo: "Quem vai querer ser acionado nessa hora?" :-)

Se conseguir convencer alguém da gerência (ou acima), melhor ainda. Aí eles ajudam a "pressionar".


Mas eu te entendo, tem vezes que é difícil mesmo, aí só mesmo com gambiarra...

0

Sinceramente, acredito que esses ajustes não serão necessários se o novo governo reinstituir o horário de verão, o que acredito que seja possível, e deixando as regras do jeito que estavam, que ofereciam previsibilidade nas datas de ínicio e término.

Só para deixar uma opinião. Os mantenedores da JVM poderiam colocar uma flag para indicar se o horário de verão está em uso, e permitir ao desenvolvedor desativar o horário de verão, para ser uma solução mais fluida.

Um hipotético exemplo (esse código não existe de fato):

LocalTime horaAtual = LocalTime.now(ZoneId.of("America/São_Paulo")).daylightSavingTime(false);
1
1

A solução ideal é atualizar a JVM para que ela tenha as novas regras. Você pode acompanhar por aqui se há uma nova versão que já contempla as mudanças de horário de verão, e depois usar o Timezone Updater Tool. Assim, toda vez que você usa algo como ZoneId.of("America/São_Paulo"), ele já pegará as novas regras e você não precisa se preocupar em verificar se está ou não em horário de verão: o identificador America/São_Paulo já "sabe" disso e cuida de todos os detalhes pra vc.

É pra isso que esses identificadores servem. Qualquer tentativa de gerenciar manualmente pode "funcionar" em alguns casos, mas vai criar mais problemas no longo prazo (problemas que vc não terá se manter a JVM atualizada).