Problemas com TimeZone ao persistir datas

Pessoal,

Estou com um problema ao tratar datas no meu sistema onde eu devo ir adicionando alguns meses à uma data e persisti-los na base.

O problema é que ao adicionar 1 mês à data 04/10/2007 00:00:00 e passar para novembro de 2007, a data é atualizada com 1 hora a mais, ou seja, 04/11/2007 01:00:00.

Não encontrei um modo de desativar o DST do TimeZone que o JBoss está utilizando e gostaria de saber se há alguma solução para isso. O que eu gostaria é que o sistema tratasse essas datas sem considerar o horário de versão. O código que eu estou utilizando para manipular a data é o seguinte:


    public static Date adicionarMeses(Date data, int quantidadeMeses) {
    	 
    	Calendar cal = GregorianCalendar.getInstance(TimeZone.getDefault());
    	cal.set(Calendar.DST_OFFSET, 0);

    	cal.setTimeInMillis(data.getTime());
    	
    	cal.add(Calendar.MONTH, quantidadeMeses);
    	 
    	return cal.getTime();
    }

Encontrei alguns links dizendo que este problema só se aplica à formatação, mas meu erro ocorre justamente quando essa data é passada como parâmetro para o EntityManager da aplicação, fazendo uma busca por um atributo de data de uma Entity.

Alguém já passou por isso ou sabe como contornar o problema?

Obrigado.

ps: Estou rodando a aplicação web no jboss 4.2.2 utilizando seam 2.0.1.

Passei por um problema semelhante, tente isso:

public static Date adicionarMeses(Date data, int quantidadeMeses) {   
       
    Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("America/Sao_Paulo"));   
    cal.set(Calendar.DST_OFFSET, 0);   
  
    cal.setTimeInMillis(data.getTime());   
       
    cal.add(Calendar.MONTH, quantidadeMeses);   
       
    return cal.getTime();   
}  

Ou ao invés de TimeZone.getTimeZone(“America/Sao_Paulo”) tenta TimeZone.getTimeZone(System.getProperty(“user.timezone”)); que daí ele pega o time zone da máquina mesmo :wink:

[quote=marvera]Pessoal,

Estou com um problema ao tratar datas no meu sistema onde eu devo ir adicionando alguns meses à uma data e persisti-los na base.

O problema é que ao adicionar 1 mês à data 04/10/2007 00:00:00 e passar para novembro de 2007, a data é atualizada com 1 hora a mais, ou seja, 04/11/2007 01:00:00.
[/quote]

Isso acontece porque o Calendario está setado para um TimeZone que nessa data ativa o Day-Light Saving Time (DST) - o horario de verão / inverno. A única forma de isso não acontecer é usar o TimeZone GMT para o seu calendario. Assim as contas serão feitas sem utilizar o DST.


    public static Date adicionarMeses(Date data, int quantidadeMeses) {
    	 
    	Calendar cal = GregorianCalendar.getInstance(TimeZone.gettimeZone("GMT+00:00"));
    	
    	// etc...
    }

Cuidado ao trabalhar com datas. Vc tem que saber exactamente o que espera obter. utilize testes unitários para manter o controle deste tipo de calculo

Oi Thiago, obrigado pela resposta. Fiz a tentativa com ambos os timezones e o erro persistiu.

Sérgio,

Obrigado, eu também tentei da seguinte forma:


    public static Date adicionarMeses(Date data, int quantidadeMeses) {

    	Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT+00:00"));

    	cal.setTimeInMillis(data.getTime());
    	
    	cal.add(Calendar.MONTH, quantidadeMeses);   ****
    	 
    	return cal.getTime();
    }

Mas ao passar de Oct 04 2007 00:00:00 para Nov 04 2007 00:00:00, o calendário continua me retornando a data
Nov 04 2007 01:00:00.

Acredito que tenha a ver com o container, mas não sei onde configurar.

Obrigado

problema persiste… alguma idéia?

Estou com o mesmo problema cara!
Tentarei esse GMT+00:00.