sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan indsætter man den samme dato i mongodb som læst fra String gennem java?

Der er to problemer med det, du i øjeblikket forsøger at gøre:

  1. Du har en tastefejl i den anden kodelinje, hvilket betyder, at dine måneder analyseres som minutter
  2. Som nævnt tager du ikke højde for tidszone.

For at løse det første problem skal du ændre

Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);

til

Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);

Datoformater skelner mellem store og små bogstaver. Det, du forsøgte at gøre, var at parse måneden som en **min** i stedet for en **M**måned. I den test, jeg kørte, betød det, at månederne alle udkom som januar, hvilket jeg også kan se skete i dit eksempel. Jeg bemærker også, at din første kodelinje, formateringsværktøjet (som ER indstillet korrekt) ikke bruges.

Det andet problem er, at ja, Java Date s opfør dig ikke, som du forventer. De SKAL have en tidskomponent, selvom du er ligeglad med det blot for datoen. Derudover skal de have en tidszone, da de har en tid.

Du har måske ikke valget mellem at flytte til det overlegne Joda-bibliotek, i hvilket tilfælde der er måder at omgå dette på. Jeg har skrevet en test, som skulle demonstrere dette:

@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"));
}

Så du kan se, at jeg har brugt det korrekte format, men også sat dens tidszone til UTC (så den har en offset på nul og ingen sommertid). Når du derefter analyserer datoen med denne formatering, vil datoen komme ud med et klokkeslæt, der er midnat i UTC-tidszonen. Fordi min computer er i Europa, når jeg udskriver denne dato, viser den klokken 02.00, fordi denne tidszone er 2 timer før UTC. Men når jeg bruger den forældede toGMTString metode, kommer tiden ud som nul.

Når du gemmer denne dato i MongoDB ved hjælp af Java-driveren, gemmer den datoen, klokkeslættet og tidszonen med den, selvom det eneste, du bekymrer dig om, er datoen. Hvad du skal gøre, når du læser datoerne ud igen, er at huske, at de er i UTC og indstille tidszonen korrekt.

Alternativt kan du gemme dem i MongoDB uden at ændre tidszonen, forudsat at du altid læser dem ind og skriver dem ud i samme tidszone. Men dette er fyldt med uventede fejl, når a) håndtering af tider over midnat og b) sommertid starter (eller stopper).

Eller brug bare Joda-Time .



  1. MongoError:getaddriinfo ENOTFOUND undefined undefined:27017

  2. Redis under klassisk ASP(VBScript)

  3. Jeg vil omdirigere til forskellige sider baseret på en eller anden betingelse

  4. mongoDB:hvordan man vender $unwind