Problema com conversão de datas (Joda Time para Date)

Pessoal, boa tarde!

Quando converto um DateTime para Date estou perdendo uma hora.

Alguém já teve esse problema? Dei uma pesquisada no pai google e não encontrei nada.

O que eu acho mais esquisito é que quando “re-converto” a hora perdida volta…

Será que é algum problema por causa do horário de verão?

import java.util.Date;

import org.joda.time.DateTime;

public class TestesDatas {

    public static void main(String[] args) {
                
        DateTime dataInicial = new DateTime();
        Date dataConvertida = dataInicial.toDate();
        DateTime dataReconvertida = new DateTime(dataConvertida);

        System.out.println("Data inicial:      " + dataInicial);     //2009-10-22T16:02:40.574-02:00
        System.out.println("Data converitda:   " + dataConvertida);  //Thu Oct 22 15:02:40 BRT 2009
        System.out.println("Data reconvertida: " + dataReconvertida);//2009-10-22T16:02:40.574-02:00

    }
}

Agradeço a todos…

Trabalha com long p/ facilitar

         System.out.println("Data inicial:      " + dataInicial);     //2009-10-22T16:02:40.574-02:00  
         System.out.println("Data converitda:   " + dataConvertida);  //Thu Oct 22 15:02:40 BRT 2009  
         System.out.println("Data reconvertida: " + dataReconvertida);//2009-10-22T16:02:40.574-02:00  

Acho que seu Java está configurado para não reconhecer o horário de verão, senão imprimiria BRST (Brazil Daylight Savings Time).

É sim amigão. Olha só:

2009-10-22T16:02:40.574-02:00

Esse -2 é a diferença GMT. Quando você converte ele vira BRT, e o timezone BRT é GMT-3. Daí a diferença :smiley:

Hummmm Não é o Java. Deixe marcado a opção no Windows “Ajustar automaticamente para o horário de verão” e rode o programa novamente. Se for isso eu prolongo o assunto e explico.

[quote=entanglement] System.out.println("Data inicial: " + dataInicial); //2009-10-22T16:02:40.574-02:00 System.out.println("Data converitda: " + dataConvertida); //Thu Oct 22 15:02:40 BRT 2009 System.out.println("Data reconvertida: " + dataReconvertida);//2009-10-22T16:02:40.574-02:00

Acho que seu Java está configurado para não reconhecer o horário de verão, senão imprimiria BRST (Brazil Daylight Savings Time). [/quote]

Deve ser isso mesmo…

Pq quando eu DESMARCO a opção do horário de verão no windows as conversões funcionam corretamente.

Tentei setando o TimeZone, mas não adiantou.


import java.util.Date;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public class TestesDatas {
    
    private static final String TIME_ZONE = "America/Sao_Paulo";

    public static void main(String[] args) {

        TimeZone.setDefault(TimeZone.getTimeZone(TIME_ZONE));
        DateTimeZone.setDefault(DateTimeZone.forID(TIME_ZONE));
        
        Date data = new Date();
        DateTime dataInicial = new DateTime();
        Date dataConvertida = dataInicial.toDate();
        DateTime dataReconvertida = new DateTime(dataConvertida);

        Date teste = new Date(dataInicial.getMillis());
        
        System.out.println("Data simples:      " + data);
        System.out.println("Data inicial:      " + dataInicial);
        System.out.println("Data converitda:   " + dataConvertida);
        System.out.println("Data reconvertida: " + dataReconvertida);
        System.out.println("Data teste:        " + teste);

    }
}

E ae pessoal, mais alguma ideia?

Valeu…

Cara é o seguinte.

O Windows tem uma belíssima “cagada” de ter esta opção. O que ela faz: Diz que o seu TimeZone dentro do seu horário de verão é GMT-3. Só que o Java possui uma definição a parte dentro dele, que diz que é GMT-2.

Nunca mas nunca, defina TimeZone na mão. Sei por experiência própria que o melhor é jogar conforme as regras.

Se você está no Brasil dentro da Zona do Horário de Verão, você está em GMT-2. Logo, se o Windows abre esta opção e MENTE dizendo que você está em GMT-3, o erro está aí. Para confirmar isso é só olhar um mapa mundi com timezones, veja que o Brasil estará em GMT-3, mas dentro do horário de verão assumimos a posição de GMT-2. É Geografia e não informática.

Para fazer a conversão sem se preocupar com isso, você pode passá-la para string e realizar parse. Mas se quiser realmente entender o problema e resolver, dá uma olhada nesse artigo que escrevi desconsiderando o produto, o procedimento é genérico: http://www.mcfox.com.br/wiki/index.php?title=PSOffice_e_o_Horário_de_Verão

Demorei 2 transições para entender direito. Vale a pena descobrir o porquê.

Abração! Qualquer coisa estamos aí!

Nem o tzupdater resolveu…

Continuo com mesmo problema.

Quando uso o DateTime (joda) a hora vem certinha, mas quando uso Date (java.util) perco uma hora…

O pior é que minha aplicação em dado momento precisa converter um DateTime para Date e não posso alterar isso…

Continuarei tentando achar a solução…

Valeu…

Cara,

O problema não é nenhuma das duas APIs, lê a parte funcional. Você precisa trabalhar em GMT-2 (se estiver dentro do horário de verão) e GMT-3 (fora dele).

  • Aplique o tzupdater (já aplicou)
  • Atualize o Sistema Operacional (no link que te passei tem uma página da MS sobre horário de verão + como atualizar em outros sistemas)
  • Deixe MARCADO a opção do “Ajustar automaticamente para o horário de verão”

Preste atenção neste último passo. Só o Windows possui essa opção. Nenhum outro sistema tem a opção de “mentir” que você está em GMT-3 depois do dia 18 de Outubro.

A sua API java.util.Date está pegando “BRT” pq o Sistema Operacional está mentindo para sua JVM. E seu Joda está Correto.

Como os dois possuem TimeZone diferentes (Joda/java.util.Date) haverá compensação no ato da conversão.