MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да вмъкна същата дата в mongodb като прочетена от String през java?

Има два проблема с това, което се опитвате да направите в момента:

  1. Имате правописна грешка във втория ред на кода, което означава, че вашите месеци се анализират като минути
  2. Както споменахме, не вземате предвид часовата зона.

За да разрешите първия проблем, трябва да промените

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

към

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

Форматите на датата са чувствителни към главни и малки букви, това, което се опитвате да направите, е да анализирате месеца като **m**минута вместо **M**месец. В теста, който проведох, това означаваше, че всички месеци излизат като януари, което виждам, че се случва и във вашия пример. Освен това забелязвам, че вашият първи ред от код, форматиращият (който Е настроен правилно) не се използва.

Вторият проблем е, че да, Java Date не се държат така, както очаквате. Те ТРЯБВА да имат времеви компонент, въпреки че не ви интересува просто за датата. Освен това те трябва да имат часова зона, тъй като имат време.

Може да нямате избор да преминете към превъзходната библиотека Joda, в който случай има начини да заобиколите това. Написах тест, който трябва да демонстрира това:

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

Така че можете да видите, че използвах правилния формат, но също така зададох неговата часова зона на UTC (така че има отместване нула и няма лятно часово време). След това, когато анализирате датата с този форматиращ инструмент, датата ще излезе с час, който е полунощ в часовата зона UTC. Тъй като компютърът ми е в Европа, когато отпечатам тази дата, той показва час 2 сутринта, тъй като тази часова зона е с 2 часа пред UTC. Но когато използвам остарелия toGMTString метод, времето излиза като нула.

Когато съхраните тази дата в MongoDB с помощта на Java драйвера, тя ще запази датата, часа и часовата зона с нея, дори ако всичко, което ви интересува, е датата. Това, което ще трябва да направите, когато четете отново датите, е да запомните, че са в UTC и да зададете подходящата часова зона.

Като алтернатива можете да ги съхранявате в MongoDB, без да променяте часовата зона, при условие че винаги ще ги четете и записвате в същата часова зона. Но това е изпълнено с неочаквани грешки, когато а) се работи с часове над полунощ и б) лятното часово време започва (или спира).

Или просто използвайте Joda-Time .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Редовен израз Пролетни хранилища на данни mongodb

  2. $elemMatch и актуализиране

  3. шестнадесетичен вместо base64 в BinData() - MongoDB

  4. Картата на PHP MongoDB намалява грешката на твърдението на db

  5. MongoDB:вмъкнете документи със специфичен идентификатор вместо автоматично генериран ObjectID