New java.util.Date() trazendo hora a mais no iReport

Olá! Estou gerando relatórios com 1 hora a mais no iReport em Java.

No ‘Text Field Expression:’ new java.util.Date()

E no Expression Class: java.lang.String

Alguém pode me auxiliar a resolver?

Obrigado

Que hora é no servidor? Está com horário de verão automático?

1 curtida

a hora no PC está correta, nos servidores de aplicação e BD também.

Tem algum timezone configurado no iReport?

1 curtida

Então não sei dizer. Onde fica esse time zone sabe me informar? É o iReport mais antigo versão: 5.0.4.

Os horários estão iguais, OK, mas os fusos estão iguais também?
Suspeito que há uma diferença de fuso horário entre sua máquina e seus servidores.

1 curtida

a minha máquina exibe para mim horário correto, os servidores também.


dá uma hora mais sempre

Essa á parte do Designer:

Não importa o horário do servidor, a JVM tem suas próprias configurações de fuso horário.

Palpite

Faça um teste usando a mesma JVM que roda o Report, com a seguinte classe:

import java.util.TimeZone;

public class TesteTimeZone {
    public static void main(String[] args) {
        System.out.println(TimeZone.getDefault());
    }
}

A saída será algo do tipo:

sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,dstSavings=0,useDaylight=false,transitions=93,lastRule=null]

Meu palpite é que sua JVM esteja com as regras do horário de verão desatualizadas. Se aparecer ali no meio useDaylight=true, meu palpite está certo :slight_smile:

Aí bastaria atualizar a JVM, as versões mais novas já contém as regras atuais. Ou vc pode rodar o TZUpdater Tool, veja aqui um exemplo.

Não sei qual lugar posso rodar este código, a versão do iReport é a 5.0.4.

No prompt de comando, conforme o exemplo do link que o @hugokotsubo postou.

Em princípio o problema não é o iReport e sim sua versão do Java

O iReport roda em Java. Então na máquina onde ele roda tem um Java instalado.

Basta usar esse mesmo Java (na máquina em que ocorre o problema) pra rodar o teste que sugeri. Também é interessante rodar em outra máquina que não dá o problema, pra ver se dá diferença. Se meu palpite estiver certo, na que está com erro vai aparecer useDaylight=true (indicando que a configuração da JVM está com horário de verão ativo, o que explicaria o problema), e na que funciona vai aparecer useDaylight=false (que é o correto, já que neste ano não temos horário de verão).

Se for confirmado que o problema é a configuração do horário de verão, basta rodar o TzUpdater (ou atualizar a versão do Java) na máquina que está com problema, como já indicado.

Olá! Parece que o problema está relacionado ao fuso horário ou configurações de data do seu sistema. Uma solução seria ajustar o fuso horário no seu código Java para corresponder ao horário correto. Você pode fazer isso usando a classe Calendar e o método setTimeZone . Por exemplo:

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("GMT-3")); // Ajuste o valor de acordo com o seu fuso horário
Date date = cal.getTime();

Verifique também se as configurações de fuso horário em seu sistema operacional estão corretas. Durante meu trabalho em processos internos para penalty shoot out robo, tive um problema semelhante e esta solução me ajudou.