Há dois problemas com o que você está tentando fazer no momento:
- Você tem um erro de digitação na segunda linha de código, o que significa que seus meses estão sendo analisados como minutos
- Como mencionado, você não está levando em consideração o fuso horário.
Para resolver o primeiro problema, você precisa mudar
Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
para
Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
Os formatos de data diferenciam maiúsculas de minúsculas. O que você estava tentando fazer era analisar o mês como **m**inuto em vez de **M**onth. No teste que fiz, isso significava que todos os meses estavam saindo como janeiro, o que posso ver que estava acontecendo no seu exemplo também. Além disso, noto que sua primeira linha de código, o formatador (que está configurado corretamente) não é usado.
O segundo problema é que sim, Java
Date
s não se comportam da maneira que você espera. Eles DEVEM ter um componente de tempo, mesmo que você não se importe com isso simplesmente pela data. Além disso, eles devem ter um fuso horário, pois têm um horário. Você pode não ter a opção de mudar para a biblioteca Joda superior; nesse caso, existem maneiras de contornar isso. Eu escrevi um teste que deve demonstrar isso:
@Test
public void shouldParseDateCorrectly() throws Exception {
// Given
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
// When
Date parsedDate = format.parse("21/08/2012");
// Then
Assert.assertThat(parsedDate.toString(), is("Tue Aug 21 02:00:00 CEST 2012"));
Assert.assertThat(parsedDate.toGMTString(), is("21 Aug 2012 00:00:00 GMT"));
}
Então você pode ver que eu usei o formato correto, mas também configurei seu fuso horário para UTC (para que ele tenha um deslocamento de zero e sem horário de verão). Então, quando você analisar a data com este formatador, a data sairá com uma hora que é meia-noite no fuso horário UTC. Como meu computador está na Europa, quando imprimo esta data, mostra um horário de 2h, pois esse fuso horário está 2 horas à frente do UTC. Mas quando eu uso o obsoleto
toGMTString
método, o tempo sai como zero. Quando você armazena essa data no MongoDB usando o driver Java, ele salvará a data, a hora e o fuso horário com ela, mesmo que tudo o que importa seja a data. O que você precisará fazer quando ler as datas novamente é lembrar que elas estão em UTC e definir o fuso horário adequadamente.
Alternativamente, você pode armazená-los no MongoDB sem alterar o fuso horário, desde que você sempre os leia e escreva no mesmo fuso horário. Mas isso está repleto de bugs inesperados quando a) lidar com horários acima da meia-noite eb) o horário de verão entra em ação (ou para).
Ou apenas use Joda-Time .