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?