2012-08-05 14 views
8

Mój format ciągów daty jest taki: 2 stycznia 2012 Po wykonaniu metody Instant.parse() instancja natychmiastowa staje się data 1 stycznia 2012 r., czyli 1 dzień wcześniej, dlaczego? Jeśli data oryginalny ciąg jest 01 stycznia 2012, Instant będzie data 31 grudnia, 2011.data w MongoDB: podczas wstawiania obiektów Date do bazy danych Mongo, data staje się 1 dzień wcześniej niż ona sama

String dateString="Jan 1, 2012"; 
Instant instant = Instant.parse(dateString, new DateTimeFormatterBuilder() 
.appendMonthOfYearShortText() 
.appendLiteral(" ") 
.appendDayOfMonth(1) 
.appendLiteral(", ") 
.appendYear(4, 4) 
.toFormatter()); 

DateTime dateTime = new DateTime(instant); 
Date date = new Date(dateTime.getMillis()); 

document.append("time", new Date(dateTime.getMillis())); 
tagsDbCollection.insert(document); 

Używam MongoDB przechowywać te daty. Przetestowałem i pokazuje się, kiedy formatuję ciąg daty-> natychmiast, bez pomyłki. Ale kiedy wstawiam ten obiekt typu Date do MongoDB, ciąg daty w MongoDB staje się 1 dzień wcześniej., Dlaczego?

W MongoDB:

/* 0 */ 
    { 
     "_id" : ObjectId("50221a40da74d74053abb445"), 
     "time" : ISODate("2011-12-31T14:00:00Z") 
    } 
+1

Czy próbowałeś dodać składnik strefy czasowej? Może to być coś ze swoim lokalnym i data zostanie wyrównana przez strefę czasową. –

Odpowiedz

1
final String dateString = "Jan 2, 2012"; 
final DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendMonthOfYearShortText().appendLiteral(" ").appendDayOfMonth(1).appendLiteral(", ").appendYear(4, 4).toFormatter(); 
final DateTime jodaDate = dtf.parseDateTime(dateString); 
System.out.println(jodaDate); 
final Date javaDate = new Date(jodaDate.getMillis()); 
System.out.println(javaDate); 

Wyjście jest

2012-01-02T00:00:00.000+02:00 
Mon Jan 02 00:00:00 EET 2012 

Następny do:

final String dateString = "Jan 1, 2012"; 

wyjścia jest:

2012-01-01T00:00:00.000+02:00 
Sun Jan 01 00:00:00 EET 2012 
+0

Dzięki za odpowiedź. Tak, ciąg daty-> Natychmiastowy nie jest zły. To jest, kiedy wstawiam te daty na MongoDB, ten problem wychodzi. Wciąż nie wiem, dlaczego ... Zaktualizowałem to pytanie. –

+0

Może to być TimeZone -10. Tak zaoszczędzony czas 14.00 poprzedniego dnia. Kiedy pracuję z MongoDB, zapisuję datę jak długa wartość w millis – Ilya

+0

Tak, to jest problem strefy czasowej. Jestem w Brisbane w Australii. Jest to UTC + 10. [Ta strona] (https: //jira.mongodb.org/browse/CSHARP-185) mówi: "MongoDB przechowuje wszystkie DateTimes w UTC. Wszystkie podane czasy lokalne są konwertowane na UTC, gdy są przechowywane w bazie danych". I znalazłem po wstawieniu, gdy zapytanie o daty z MongoDB przez jego API Java, daty są ponownie konwertowane na czas lokalny. Teraz jest OK. Dziękuję Ci. –

1

Mongo przechowuje daty w milisekundach od epoki Unix.

Patrz: http://www.mongodb.org/display/DOCS/Dates

Więc nie ma żadnego strefę czasową. Ale jeśli użyjesz konsoli, parser .js konwertuje daty UTC do bieżących ustawień strefy czasowej systemu.

Można sprawdzić, że:

  • Załóż Podmiot o niektóre dane aktualne.
  • następnie wysyłając zapytanie przez konsolę. (Użycie String())
  • następnie zamknąć konsolę i ponownie skonfigurować strefę czasową systemu (Debian/Ubuntu: sudo dpkg-reconfigure tzdata)
  • następnie ponownie wejść do konsoli i kwerendy swoje stare dane => dostaniesz taką samą UTC ale różni toString() wyprowadza
0

można sprawdzić strefę czasową UTC, w zasadzie Mongo funkcjonowanie serwera w zależności od strefy czasowej UTC

Format SimpleDateFormat = new SimpleDateFormat ("dd/mm/rrrr"); format.setTimeZone (TimeZone.getTimeZone ("UTC"));

Powiązane problemy