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

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

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.