sql >> Database >  >> NoSQL >> MongoDB

Hoe voeg je dezelfde datum in mongodb in als gelezen uit String via Java?

Er zijn twee problemen met wat u momenteel probeert te doen:

  1. Je hebt een typefout in de tweede regel code, wat betekent dat je maanden worden geparseerd als minuten
  2. Zoals gezegd, je houdt geen rekening met de tijdzone.

Om het eerste probleem aan te pakken, moet u

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

naar

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

Datumnotaties zijn hoofdlettergevoelig, wat u probeerde te doen is de maand te ontleden als een **m**inute in plaats van een **M**onth. In de test die ik deed, betekende dat dat de maanden allemaal als januari uitkwamen, wat ik ook in jouw voorbeeld kan zien. Ik merk ook dat je eerste regel code, de formatter (die IS correct is ingesteld) niet wordt gebruikt.

Het tweede probleem is dat ja, Java Date s gedragen zich niet zoals je verwacht. Ze MOETEN een tijdcomponent hebben, ook al geeft het je niet alleen om de datum. Bovendien moeten ze een tijdzone hebben omdat ze tijd hebben.

Je hebt misschien niet de keuze om naar de superieure Joda-bibliotheek te verhuizen, in welk geval er manieren zijn om dit te omzeilen. Ik heb een test geschreven die dit zou moeten aantonen:

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

Je kunt dus zien dat ik het juiste formaat heb gebruikt, maar ook de tijdzone heb ingesteld op UTC (dus het heeft een offset van nul en geen zomertijd). Wanneer u vervolgens de datum met deze formatter analyseert, komt de datum uit met een tijd die middernacht is in de UTC-tijdzone. Omdat mijn computer zich in Europa bevindt, wordt bij het printen van deze datum 2 uur 's nachts weergegeven, omdat deze tijdzone 2 uur voor UTC ligt. Maar wanneer ik de verouderde toGMTString . gebruik methode, komt de tijd uit op nul.

Wanneer u deze datum opslaat in MongoDB met behulp van het Java-stuurprogramma, slaat het de datum, de tijd en de tijdzone op, zelfs als het enige waar u om geeft de datum is. Wat u moet doen als u de datums opnieuw leest, is onthouden dat ze in UTC zijn en de tijdzone op de juiste manier instellen.

Als alternatief kunt u ze in MongoDB opslaan zonder de tijdzone te wijzigen, op voorwaarde dat u ze altijd in dezelfde tijdzone leest en uitschrijft. Maar dit zit vol onverwachte bugs wanneer a) te maken heeft met tijden boven middernacht en b) zomertijd begint (of stopt).

Of gebruik gewoon Joda-Time .



  1. Mongoexport fout bij het parseren van query

  2. Geneste groepering met MongoDB

  3. Hoe automatisch trage MongoDB-query's te doden?

  4. TypeError:kan eigenschap 'items' van null niet lezen in monogdb met nodejs