Problema com Timezone - campo data

2 respostas
ignacio83

Pessoal, estou passando por um problema com relação ao Timezone:

Banco de Dados: Oracle 10g
Servidor de Aplicação: JBoss 4.2.3
JVM: 6.0 update 13

Existe um campo data_nascimento na tabela clientes no banco de dados que é do tipo DATE.

Para algumas datas específicas quando consultamos esse campo no banco de dados a data vem com uma hora a menos, ou seja, ao invés de 01/11/1966, recebo 31/10/66 23:00.

Descobri que isso ocorre para todas as datas onde o horário de verão começou…

Executem o seguinte código:

final Calendar c = Calendar.getInstance();
		c.set(1966, Calendar.NOVEMBER, 1);
		c.set(Calendar.HOUR_OF_DAY, 0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss z Z");
		System.out.println(sdf.format( c.getTime() ));
		
		c.add(Calendar.HOUR_OF_DAY, -1);
		System.out.println(sdf.format( c.getTime() ));

Reparem que a hora 00:00 do dia 01/11/1966 não existe (realmente nunca existiu, afinal a zero hora, o relógio foi adiantado em uma hora), portanto Java automaticamente assume 01:00 no calendar.

E quando subtraimos um hora, voltamos para o dia 31/10/1966

Os timezones de todos os servidores envolvidos estão com BRST (Brazilian Summer Time)

O que eu ainda não consegui entender é porque recebo uma hora a menos do banco de dados, e não uma hora a mais como acontece no teste acima.

Tentivas frustadas:

  • Atualizar o driver de acesso ao banco
  • Atualizar a JVM
  • Trocar o tipo do campo para java.sql.Date
  • Trocar o tipo do campo para java.sql.Timestamp
  • Trocar o tipo do campo para java.util.Date

Funciona porém causa outros efeitos colaterais:

  • Alterar o timezone para UTC.

A pergunta é: Como posso resolver esse problema?

2 Respostas

fabioqb

Cara, faz o seguinte:

# final Calendar c = Calendar.getInstance(TimeZone.getDefault());

Tive um problema parecido onde tive que forçar o TimeZone em validação (veja em http://blog.faque.com.br/).

ignacio83

Opa, vlw pela resposta…

Mas o código que eu postei foi apenas para teste… Mais já tentei isso e também não funcionou…

Na realidade recebo um Date do banco de dados…

Criado 10 de fevereiro de 2010
Ultima resposta 11 de fev. de 2010
Respostas 2
Participantes 2