MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak wstawić tę samą datę w mongodb jako odczytaną z String przez java?

Istnieją dwa problemy z tym, co obecnie próbujesz zrobić:

  1. Masz literówkę w drugim wierszu kodu, co oznacza, że ​​Twoje miesiące są analizowane jako minuty
  2. Jak wspomniano, nie bierzesz pod uwagę strefy czasowej.

Aby rozwiązać pierwszy problem, musisz zmienić

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

do

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

W formatach dat rozróżniana jest wielkość liter. Próbowałeś przeanalizować miesiąc jako **m**minutę, a nie **M**nth. W teście, który przeprowadziłem, oznaczało to, że wszystkie miesiące wychodzą jako styczeń, co widzę również w twoim przykładzie. Zauważyłem również, że pierwszy wiersz kodu, formater (który JEST poprawnie skonfigurowany) nie jest używany.

Drugim problemem jest to, że tak, Java Date s nie zachowują się tak, jak oczekujesz. MUSZĄ mieć składnik czasu, nawet jeśli nie zależy ci tylko na dacie. Ponadto muszą mieć strefę czasową, ponieważ mają czas.

Możesz nie mieć możliwości przejścia do lepszej biblioteki Joda, w takim przypadku istnieją sposoby na obejście tego. Napisałem test, który powinien to wykazać:

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

Widać więc, że użyłem prawidłowego formatu, ale także ustawiłem jego strefę czasową na UTC (więc ma przesunięcie zera i nie ma czasu letniego). Następnie, gdy analizujesz datę za pomocą tego programu formatującego, data wyjdzie z czasem o północy w strefie czasowej UTC. Ponieważ mój komputer jest w Europie, kiedy drukuję tę datę, pokazuje godzinę 2 w nocy, ponieważ ta strefa czasowa jest 2 godziny przed UTC. Ale kiedy używam przestarzałego toGMTString metoda, czas wyjdzie jako zero.

Kiedy zapiszesz tę datę w MongoDB za pomocą sterownika Java, zapisze on wraz z nią datę, godzinę i strefę czasową, nawet jeśli zależy Ci tylko na dacie. Po ponownym odczytaniu dat musisz pamiętać, że są one w UTC i odpowiednio ustawić strefę czasową.

Alternatywnie możesz przechowywać je w MongoDB bez zmiany strefy czasowej, pod warunkiem, że zawsze będziesz je odczytywać i pisać w tej samej strefie czasowej. Jest to jednak obarczone nieoczekiwanymi błędami, gdy a) radzimy sobie z godzinami powyżej północy i b) zaczyna się (lub zatrzymuje) czas letni.

Lub po prostu użyj Joda-Time .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Straszna mapa Zmniejszenie wydajności

  2. Ogranicz użycie pamięci RAM MongoDB

  3. Jak $pchnąć pole w zależności od warunku?

  4. Nieudana inicjalizacja globalna:ścieżka dziennika BadValue wymaga bezwzględnej ścieżki do pliku z usługami systemu Windows

  5. MongoDb 2.6.1 Błąd:17444 — Starszy punkt jest poza zakresem zapytania sferycznego