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!
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.
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);