Provavelmente sua JVM não foi atualizada com as novas regras do horário de verão brasileiro.
No Brasil, o horário de verão foi cancelado em 2019. Só que essas regras não são atualizadas automaticamente nos computadores. No caso do Java é pior ainda, porque essas regras ficam dentro da JVM, então não adianta o Sistema Operacional estar atualizado, tem que “atualizar o Java” mesmo.
Uma maneira de verificar se é isso mesmo, é fazendo um teste rápido no timezone:
Date hoje = new Date();
TimeZone tz = TimeZone.getTimeZone("America/Sao_Paulo");
System.out.println(tz.inDaylightTime(hoje));
System.out.println(tz.getOffset(hoje.getTime()));
Lembrando que só vai funcionar se a data atual for uma em que estaria em horário de verão, caso a regra ainda estivesse valendo (de novembro a fevereiro).
Se estiver em horário de verão, a saída será:
true
-7200000
E se não estiver em horário de verão, a saída será:
false
-10800000
Se de fato estiver em horário de verão, geralmente isso se resolve de duas maneiras:
-
Atualizar a versão do Java. Nesta página você pode ver as versões do JDK e a respectiva versão do TZ Database. Basta atualizar o Java para uma destas versões (e aqui você pode ver o que tem em cada versão do TZ Database - mas a versão atual já possui a nova regra do horário de verão brasileiro, então não precisa se preocupar com isso).
-
Atualizar somente o tzdata da JVM (as informações de fuso horário), sem mudar a versão do Java. Para isso, você precisa rodar o TZ Updater Tool. Um dos argumentos deste comando é o arquivo que você vai usar, e o mesmo pode ser encontrado em https://www.iana.org/time-zones
O arquivo mais recente sempre pode ser baixado em https://data.iana.org/time-zones/tzdata-latest.tar.gz. Você pode baixá-lo e rodar o comando conforme as instruções. Mas sempre verifique o site da IANA para saber se há um arquivo mais recente. Neste link há uma explicação mais detalhada sobre como fazer esta atualização, e neste link estão todas as versões, caso precise de alguma anterior à atual.
Manter as informações de timezones atualizadas é a única solução correta. Qualquer outra (como mudar o timezone) pode até “funcionar”, mas estará sujeita a erros futuros.
Por exemplo, se você escolher America/Rosario
, que atualmente não tem horário de verão. E se no futuro o governo brasileiro mudar de ideia e voltar com o horário de verão? Você vai ter que mudar de volta para America/Sao_Paulo
e atualizar a JVM (mas se você já tivesse atualizado a JVM, bastaria continuar usando America/Sao_Paulo
, e sua única preocupação passaria a ser manter o ambiente atualizado - que é algo que teria que ser feito de qualquer maneira).