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