Ci sono due problemi con ciò che stai attualmente cercando di fare:
- Hai un errore di battitura nella seconda riga di codice, il che significa che i tuoi mesi vengono analizzati come minuti
- Come accennato, non stai tenendo conto del fuso orario.
Per risolvere il primo problema, devi cambiare
Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
a
Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
I formati della data fanno distinzione tra maiuscole e minuscole, quello che stavi cercando di fare è analizzare il mese come **m**inute invece che come **M**onth. Nel test che ho eseguito, ciò significava che i mesi uscivano tutti come gennaio, cosa che posso vedere accadeva anche nel tuo esempio. Inoltre, ho notato che la tua prima riga di codice, il formattatore (che è impostato correttamente) non viene utilizzata.
Il secondo problema è che sì, Java Date
Non ti comporti come ti aspetti. DEVONO avere una componente temporale, anche se non ti interessa semplicemente per la data. Inoltre, devono avere un fuso orario poiché hanno un orario.
Potresti non avere la possibilità di passare alla libreria Joda superiore, nel qual caso ci sono modi per aggirare questo problema. Ho scritto un test che dovrebbe dimostrare questo:
@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"));
}
Quindi puoi vedere che ho usato il formato corretto, ma ho anche impostato il suo fuso orario su UTC (quindi ha un offset di zero e nessuna ora legale). Quindi, quando analizzi la data con questo formattatore, la data uscirà con un'ora che è la mezzanotte nel fuso orario UTC. Poiché il mio computer si trova in Europa, quando stampo questa data mostra l'ora delle 2 del mattino, poiché questo fuso orario è 2 ore avanti rispetto all'ora UTC. Ma quando utilizzo il deprecato toGMTString
metodo, il tempo risulta zero.
Quando memorizzi questa data in MongoDB usando il driver Java, salverà la data, l'ora e il fuso orario con esso, anche se tutto ciò che ti interessa è la data. Quello che devi fare quando rileggi le date è ricordare che sono in UTC e impostare il fuso orario in modo appropriato.
In alternativa, puoi archiviarli in MongoDB senza modificare il fuso orario, a condizione di leggerli e scriverli sempre nello stesso fuso orario. Ma questo è irto di bug imprevisti quando a) si ha a che fare con orari oltre la mezzanotte e b) l'ora legale entra (o si interrompe).
Oppure usa semplicemente Joda-Time .