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

8 respostas
D

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…

8 Respostas

J

Trabalha com long p/ facilitar

E
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).

F

É 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:

F

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.

D

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).

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…

F

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

D

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…

F

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.

Criado 22 de outubro de 2009
Ultima resposta 23 de out. de 2009
Respostas 8
Participantes 4