sql >> Databáze >  >> NoSQL >> MongoDB

Jak vložit stejné datum do mongodb jako načtené z String přes javu?

S tím, co se aktuálně pokoušíte udělat, jsou dva problémy:

  1. Ve druhém řádku kódu máte překlep, což znamená, že vaše měsíce jsou analyzovány jako minuty
  2. 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 .



  1. Výsledek dotazu Mongoose .find obsahuje metadata dotazu? nelze pouze ručně promítnout každou vlastnost sbírky, jak získat pouze dokument?

  2. JBAS011445:Nepodařilo se získat adaptér pro poskytovatele persistence 'org.hibernate.ogm.jpa.HibernateOgmPersistence'

  3. Dotazování uvnitř polí Postgres JSON

  4. Vytvoření celého modelu pouze pro čtení pomocí Mongoid