JAVA Calender hora esta errada

estou usando atualmente esse script para setar a hora, mas por algum motivo, a hora setada ta adiantada 1 hora

public void actionPerformed(ActionEvent e) {
            Calendar now = Calendar.getInstance(TimeZone.getTimeZone("America/Sao_Paulo"));
            hora.setText(String.format("%1$tH:%1$tM:%1$tS", now));
}

tentei usarar um fuso horario da argentina, funciono, mas ele ta uns minutos adiantado(faz sentido, ja que nao é daqui)

public void actionPerformed(ActionEvent e) {
        Calendar now = Calendar.getInstance(TimeZone.getTimeZone("America/Rosario"));
        hora.setText(String.format("%1$tH:%1$tM:%1$tS", now));
}
1 curtida

@Mauricio_Schonardie por esses dias foi visto que vários dispositivos tanto celulares, computadores e relógios digitais tiveram um adiantamento de 1h, ainda não pesquisei o porque, mas isto já é um norte para o seu problema atual.

Na empresa onde trabalho precisamos conectar a Sefaz e com o timezone de “Cuiabá” -4 não está funcionando, então colocamos de “Caracas” -4 e funcionou normalmente, poderia pegar um -3, questão dos minutos verifique servidores Argentina: 11:35 (time.is)

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:

  1. 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).

  2. 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).

2 curtidas