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.