Date Parsing esquisito

4 respostas
F

Olá, pessoal.

Estou com um problema bastante inusitado ao tentar fazer o parsing de algumas datas.

Abaixo segue o código que utilizo. Nos comentários, coloquei o output dos códigos.

System.out.println(Locale.getDefault()); // = pt_BR
String format = "MM/dd/yyyy HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(format);
//SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US); //tentei também com este construtor, mas não resolveu...
Date x = sdf.parse("10/06/1996 00:00:00");
System.out.println(x.toString()); // = Sun Oct 06 01:00:00 BRST 1996

Como podem observar, a data original vem acrescida de uma hora. Acredito que não esteja relacionado a problemas de horário de verão, pois quando coloco algum valor superior a uma hora neste campo (ex.: 13:00:00), não há acréscimo algum. Alguma dica?

Abraços,

Fábio

4 Respostas

F

Novos exemplos:

String format = "MM/dd/yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(format);
//SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US);
Date x = sdf.parse("10/06/1996"); 
System.out.println(x.toString()); // = Sun Oct 06 01:00:00 BRST 1996
Date y = sdf.parse("10/17/2010");
System.out.println(y.toString()); // = Sun Oct 17 01:00:00 BRST 1996
Date z = sdf.parse("10/18/2010");
System.out.println(z.toString()); // = Mon Oct 18 00:00:00 BRST 2010

No último exemplo (variável z), a data é convertida corretamente, sem o acréscimo de uma hora.

Algum palpite?

[]´s,

Fábio

R

Este problema ocorre quando o timezone está desatualizado. Baixe o “JDK DST Timezone Update”[1] para atualizar seu timezone.

E tem uma informação bem interessante escrito pelo Vitor Buitoni - “Ajustando as informações de horario de verão no Java.” [2]

Outra opção é utilizar a API Joda-Time.[3]

Talvez ajude de alguma maneira.

[1] http://java.sun.com/javase/timezones/
[2] http://javafree.uol.com.br/artigo/12070/Ajustando-as-informacoes-de-horario-de-verao-no-Java.html
[3] http://joda-time.sourceforge.net/

F

Razec,

Obrigado. Consegui resolver o problema.

Na verdade, o TimeZone já estava atualizado, porém havia uma alteração na instância do SimpleDateFormat [.setLenient(false)] que eu estava utilizando:

...
    if (dateFormat != null) {
      m_DateFormat = new SimpleDateFormat(dateFormat);
    } else {
      m_DateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    }
    m_DateFormat.setLenient(false);
...

Com isto, ao passar algumas datas no formato extenso (“2010-10-17T00:00:00”), era gerada a ParseException, pois para estas datas, não há o horário “00:00:00” (horário de verão).

Com “.setLenient(true)”, estas datas são automaticamente acrescidas em uma hora, e portanto, nenhuma Exception é gerada. Explicando, também, o motivo pelo qual estas datas quando passadas no formato curto (“2010-10-17”) já iniciam com Time = “01:00:00”.

Att,

Fábio

D

Eu também estou com esse problema. Meu TimeZone está atualizado…

Não existe uma forma de criar esta data, 17-10-2010, exatamente às 00:00:00?

Criado 8 de junho de 2010
Ultima resposta 21 de nov. de 2010
Respostas 4
Participantes 3