[RESOLVIDO] Dúvida JodaTime + Horário de verão

Bom dia,

é o seguinte, estou usando um DateTime como chave de um Map. Preciso apenas do dia, mês e ano, então, crio os objetos da seguinte forma:

DateTime date = DateTimeFormat.forPattern("dd/MM/yyyy").parseDateTime("30/10/2010");

O problema, é que em determinado ponto do meu código, preciso usar o método minusDays(int) pra buscar dias anteriores ao corrente.

A maior parte das vezes ocorre tudo corretamente, como no exemplo a seguir (não é o código usado, é apenas um exemplo para ilustrar minha dúvida):

código:

	DateTime date = DateTimeFormat.forPattern("dd/MM/yyyy").parseDateTime("30/10/2010");

		for (int i = 0; i < 10; i++) {
			
			System.out.println(date);
			date = date.minusDays(1);
		}

saída:

2010-10-30T00:00:00.000-02:00
2010-10-29T00:00:00.000-02:00
2010-10-28T00:00:00.000-02:00
2010-10-27T00:00:00.000-02:00
2010-10-26T00:00:00.000-02:00
2010-10-25T00:00:00.000-02:00
2010-10-24T00:00:00.000-02:00
2010-10-23T00:00:00.000-02:00
2010-10-22T00:00:00.000-02:00
2010-10-21T00:00:00.000-02:00

Vejam que o método minusDays(int) segue um padrão, subtraindo um dia e mantendo todo o resto constante.

Mas nem sempre isso ocorre. Olha o que acontece quando mudo a data de “30/10/2010” para “20/10/2010”:

2010-10-20T00:00:00.000-02:00
2010-10-19T00:00:00.000-02:00
2010-10-18T00:00:00.000-02:00
2010-10-17T01:00:00.000-02:00
2010-10-16T01:00:00.000-03:00
2010-10-15T01:00:00.000-03:00
2010-10-14T01:00:00.000-03:00
2010-10-13T01:00:00.000-03:00
2010-10-12T01:00:00.000-03:00
2010-10-11T01:00:00.000-03:00

Do dia 17 para baixo, é acrescentado uma hora, e acredito que isso seja em decorrência do horário de verão. Essa mudança no horário ferra com minhas operações de igualdade, pois, datas que eu gostaria que fossem iguais, acabam tornando-se diferentes por conta da diferença de horário. Ao instanciar um DateTime, obtenho uma data com horário “0:00”, mas na subtração, o horário acaba indo pra “1:00” em alguns pontos. A situação se agrava ainda mais quando tento instanciar “17/10/2010”:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot parse "17/10/2010": Illegal instant due to time zone offset transition (America/Sao_Paulo)
	at org.joda.time.format.DateTimeParserBucket.computeMillis(DateTimeParserBucket.java:390)
	at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:849)
	at data.YahooCsv.main(YahooCsv.java:151)

Acada dando erro, provavelmente, por conta da transição do dia “normal” para um dia de “horário de verão”, pois não existe o horário “0:00”.

Já pensei em duas maneiras de se resolver o problema:
-usar String no lugar de DateTime como chave
-instanciar o DateTime sempre com o mesmo horário que não esteja no intervalo [0:00~0:59]

No entanto, acho que ambas as abordagens possuem desvantagens, sendo que a segunda é uma gambi da desgraça =D. Alguém tem uma ideia de como resolver esse problema?

Desde já, agradeço a atenção.

Eu usei Joda Time em um dos meus projetos, e gostei muito da biblioteca!

Fiquei intrigado com sua dúvida. Dei uma pesquisada e encontrei os links abaixo:

http://joda-time.sourceforge.net/faq.html#illegalinstant esse FAQ do Joda Time explica que a exceção é gerada no caso de instanciar “17/10/2010” porque a meia noite desse dia simplesmente não existiu (assim como dia 31 de fevereiro, por exemplo).

Uma dica colocada aqui nesse post do stackoverflow (http://stackoverflow.com/questions/5451152/how-to-handle-jodatime-illegal-instant-due-to-time-zone-offset-transition) é de colocar o instanciamento em um bloco try/catch e no catch somar 1 hora na data.

Essa solução não me pareceu nada elegante. Se alguém souber de alguma tática melhor…

Abs!

Se você precisa somente da data e não da hora, use o LocalDate. Se precisa de data e hora, mas não do fuso horário, use o LocalDateTime.

Opa, eu tinha encontrado essa informação agora a pouco e vim aqui pra compartilhar.

De qualquer forma, obrigado pelos 2 que responderam ao tópico.

Escolhi o LocalDate pra resolver meu problema. Pra quem tiver problema parecido com o meu, mas precisar da hora, tem também o método toDateTimeAtStartOfDay() do DateTime, que também resolveria meu problema usando-o na instanciação na hora de criar as chaves e após efetuar o cálculo com o minusDays(int).

Valeu!!!