Data transformada errada

Tenho um web service feito com Apache Axis, que está rodando num JBoss 3.2.3 numa máquina Unix.

Quando meu cliente (feito com Axis e rodando em Windows) envia uma data para o Web Service, o WS transforma a data para um dia antes.

Explico:

No meu SOAP de request a data (“05/06/2006”) vai no XML como “2006-06-05T00:00:00”.

No Web Service, para testes, eu simplesmente pego a data e mando de volta, tanto no formato Date (Calendar) como em String (usando toString e SimpleDateFormat).

No caso de Date/Calendar vem DAY_OF_MONTH=5. Na String volta a data como 04/06/2006.

Parece que este link (http://www.guj.com.br/posts/list/30488.java) tem um problema similar, mas não vi uma solução.

Há algo pra configurar no Unix ao iniciar a VM ou mesmo no SO para ajustar isso?

Na minha máquina (Windows), quando eu inicio o JBoss com uma das seguintes configurações da JVM:

-Duser.timezone=America/Sao_Paulo -Duser.timezone=GMT-3
Ele acontece o mesmo erro que acontece lá no server.

Se eu configuro como -Duser.timezone=GMT, o problema não ocorre.

Certamente é um problema com a configuração do TimeZone.

O tratamento de Datas em Java é a coisa mais TOSCA que existe no planeta.

Se o SOAP manda “2006-06-05T00:00:00”, ele converte pra um dia antes a data, se o server está configurado para GMT-3. Isso não deveria ocorrer de modo algum.

Alguem tem alguma solução?

Tópico relacionado (JavaFree): http://www.javafree.org/javabb/viewtopic.jbb?t=12070

Dica de um amigo:

[quote]Provavelmente por você passar a data como: "2006-06-05T00:00:00", caindo na regra do horário de verão, ele volta um dia.

Se for algo do sistemas operacional, tente postar a data como "2006-06-05T03:00:00", assim se for o lance do horário de verão, será
mantida o dia como "05".

Não sei qual Unix você está utilizando. No Linux os horários de verão são configurados em: /usr/share/zoneinfo/

Se o ambiente estiver configurado para o timezone do Brasil, configure assim:

shell> vi /usr/share/zoneinfo/Brazil/horario-verao.zic

Dentro desse arquivo, coloque as seguintes linhas, separando os blocos
com a tecla TAB (->):

Rule -> Brazil -> 2006 -> only -> Oct -> 31 -> 00:00 -> 1 -> D
Rule -> Brazil -> 2007 -> only -> Feb -> 15 -> 00:00 -> 0 -> S
zone -> Brazil/East -> -3:00 -> Brazil -> E%sT

Os dias de começo e término do horário de verão podem variar, assim
como o arquivo zic, dependendo da região em que foi configurada. No
meu caso, do exemplo acima, é para o estado de SP: "East" (-3:00).
Para testar, adiante a data do seu relógio do sistema:

shell> date -s "10/31/2006 01:00"
shell> date (exibe a data do sistema)
shell> date -u (exibe a data da BIOS)

Até+ [/quote]

Se eu mando a informação do timezone na data, funciona normal: “2006-06-05T00:00:00.000-03:00”

Perceba que a informação final “-03:00” quer dizer GMT-3.

Cara, mas trabalhas com datas em Java é no mínimo infernal e uma praga maldita.

Porque diabos o Java insiste em mudar a data que eu estou enviando seguindo o timezone configurado? Talvez ele entenda que eu estou enviando no timezone GMT, e mude para o timezone local. Mas isso é sacanagem. Só faz a gente quebrar a cara.