Java.sql.Timestamp sendo transportado remotamente para máquinas com diferentes GMTs

1 resposta
L

Caros,

tenho um código +ou- assim:

java.util.Date d = new java.util.Date();

java.sql.Timestamp t = new java.sql.Timestamp(d.getTime());

pagamento.setDate(t);

O meu atributo t é persistido no banco em uma aplicação, depois é tranferido remotamente (EJB) para
outra aplicação, onde ele é persistido novamente. Nesse caminho, eu não realizo nenhuma mudança nele,
mas por incrivel que pareça, em um banco a data fica com um horário, e no outro com um horário(as vezes dia)
diferente. (Detalhe: Eu só dou um setTimestamp no PrepareStatement)

Estou desconfiando que o problema é porque essas máquinas estão com GMT diferentes. Ambas tem a mesma data,
só que o GMT delas é diferente(sei lah pq é assim, mas tah assim).

Eu fiz alguns testes rápidos aqui com um programinha main() e se eu mudo o meu GMT, mesmo sem alterar a data/hora
do sistema, ele imprime uma data diferente quando eu mando imprimir o Timestamp no console.

Ou seja:

Deixo o horário como 19:52, mas mudo o GMT para -10:00. Dai ele imprime uma hora diferente, 10:52.
Se volto o HMT para -3:00, imprime 19:52.

To meio perdido com isso tudo:

-Mesmo que os GMTs das máquinas estejam diferentes, o objeto Timestamp não é alterado. Só pelo GMT ser
diferente a data jah vai ser mudada? Como isso? E ainda sem mudar o objeto?

Alguem tem uma explicação pra isso? Da onde a JVM pega o horário? Ele não olha a hora do SO, mas olha
o GMT do SO?

Enfim, uma confusão! Se alguem puder me esclarecer, ficarei grato!

Obrigado!!!

1 Resposta

T

A classe java.sql.Timestamp herda diretamente de java.util.Date, que tem apenas um membro - um valor “long” que representa o número de milissegundos transcorridos desde 01/jan/1970, horário UTC (ou seja, GMT+00:00).

Quando você transporta um Timestamp de uma máquina para outra, você pode ter interpretações diferentes do fuso horário conforme o timezone configurado em cada uma delas, e conforme a versão do Java instalado em cada uma delas - já que o timezone do Java é configurado no próprio Java, e o timezone do Windows ou do Linux ou do Unix é configurado em outro lugar.

Existe uma ferramenta chamada tzupdater (que pode ser baixada na mesma página onde se baixa a JDK) para acertar a tabela de timezones do Java (a partir da versão 1.4). Essa ferramenta deve ser chamada periodicamente para acertar essa tabela.

Criado 18 de fevereiro de 2008
Ultima resposta 19 de fev. de 2008
Respostas 1
Participantes 2