S tím, co se aktuálně pokoušíte udělat, jsou dva problémy:
- Ve druhém řádku kódu máte překlep, což znamená, že vaše měsíce jsou analyzovány jako minuty
- Jak bylo uvedeno, neberete v úvahu časové pásmo.
Chcete-li vyřešit první problém, musíte změnit
Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
do
Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
Formáty data rozlišují velká a malá písmena, co jste se snažili udělat, je analyzovat měsíc jako **m**minutu místo **M**měsíc. V testu, který jsem prováděl, to znamenalo, že všechny měsíce vycházely jako leden, což, jak vidím, se dělo i ve vašem příkladu. Také jsem si všiml, že váš první řádek kódu, formátovač (který JE správně nastaven), není použit.
Druhý problém je, že ano, Java Date
nechováte se tak, jak očekáváte. MUSÍ mít časovou složku, i když vás to nezajímá jen kvůli datu. Kromě toho musí mít časové pásmo, protože mají čas.
Možná nebudete mít možnost přesunout se do nadřazené knihovny Joda, v takovém případě existují způsoby, jak to obejít. Napsal jsem test, který by to měl ukázat:
@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"));
}
Takže můžete vidět, že jsem použil správný formát, ale také nastavil jeho časové pásmo na UTC (takže má offset nula a žádný letní čas). Když pak analyzujete datum pomocí tohoto formátovače, datum vyjde s časem, který je o půlnoci v časovém pásmu UTC. Protože je můj počítač v Evropě, když vytisknu toto datum, ukazuje čas 2 hodiny ráno, protože toto časové pásmo je o 2 hodiny před UTC. Ale když používám zastaralý toGMTString
metoda, čas vyjde jako nula.
Když toto datum uložíte do MongoDB pomocí ovladače Java, uloží se s ním datum, čas a časové pásmo, i když jediné, na čem vám záleží, je datum. Co budete muset udělat, až budete znovu číst data, je zapamatovat si, že jsou v UTC, a správně nastavit časové pásmo.
Případně je můžete uložit do MongoDB bez změny časového pásma, za předpokladu, že je budete vždy číst a zapisovat ve stejném časovém pásmu. Ale to je plné neočekávaných chyb, když a) řešení časů přes půlnoc ab) nastává (nebo se zastaví) letní čas.
Nebo stačí použít Joda-Time .