sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur infogar man samma datum i mongodb som läst från String genom java?

Det finns två problem med det du för närvarande försöker göra:

  1. Du har ett stavfel på den andra raden i koden vilket innebär att dina månader tolkas som minuter
  2. Som nämnts tar du inte hänsyn till tidszon.

För att lösa det första problemet måste du ändra

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

till

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

Datumformat är skiftlägeskänsliga, det du försökte göra är att analysera månaden som en **min** i stället för en **M**månad. I testet jag körde innebar det att månaderna kom ut som januari, vilket jag kan se hände i ditt exempel också. Jag märker också att din första kodrad, formateraren (som ÄR korrekt inställd) inte används.

Det andra problemet är att ja, Java Date s beter sig inte som du förväntar dig. De MÅSTE ha en tidskomponent, även om du inte bryr dig om det bara för datumet. Dessutom måste de ha en tidszon eftersom de har en tid.

Du kanske inte har valet att flytta till det överlägsna Joda-biblioteket, i så fall finns det sätt att kringgå detta. Jag har skrivit ett test som ska visa detta:

@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 att jag har använt rätt format, men även ställt in dess tidszon till UTC (så den har en offset på noll och ingen sommartid). När du sedan analyserar datumet med denna formatterare kommer datumet att komma ut med en tid som är midnatt i UTC-tidszonen. Eftersom min dator är i Europa, när jag skriver ut detta datum visar den klockan 02:00, eftersom denna tidszon ligger 2 timmar före UTC. Men när jag använder den föråldrade toGMTString metoden kommer tiden ut som noll.

När du lagrar detta datum i MongoDB med Java-drivrutinen, kommer det att spara datumet, tiden och tidszonen med det, även om allt du bryr dig om är datumet. Vad du behöver göra när du läser datumen igen är att komma ihåg att de är i UTC och ställa in tidszonen på lämpligt sätt.

Alternativt kan du lagra dem i MongoDB utan att ändra tidszon, förutsatt att du alltid läser in dem och skriver ut dem i samma tidszon. Men detta är fyllt av oväntade buggar när a) hantera tider över midnatt och b) sommartid börjar (eller stannar).

Eller använd bara Joda-Time .



  1. E:Kan inte hitta paketet mongodb-org

  2. Transparent databasfailover för dina applikationer

  3. Få en lista över index i MongoDB

  4. Redis-gränsen för anslutning/buffertstorlek har överskridits