2012-08-05 14 views
8

mia data formato della stringa è come questo: 2 gennaio 2012 Dopo il metodo Instant.parse(), l'istanza istante diventa la data del 1 gennaio 2012, che è 1 giorno prima, perché? Se la stringa data originale è 1 Gennaio 2012, Instant sarà la data del 31 dicembre, 2011.Data in MongoDB: quando si inseriscono oggetti Date nel database Mongo, la data diventa 1 giorno prima del sé

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); 

sto usando MongoDB per memorizzare queste date. Ho provato e mostra quando si formatta la stringa della data-> istantanea non c'è errore. Ma quando inserisco questo oggetto Date in MongoDB, la stringa di data in MongoDB diventa 1 giorno prima., Perché?

In MongoDB:

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

Hai provato ad aggiungere un componente fuso orario? Potrebbe essere qualcosa con il tuo locale e la data viene compensata dal tuo fuso orario. –

risposta

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); 

uscita è

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

successivo Per:

final String dateString = "Jan 1, 2012"; 

uscita è:

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

Grazie per la risposta. Sì, la stringa della data-> Instant non è sbagliata. È quando inserisco queste date in MongoDB, questo problema emerge. Ancora non so perché ... Ho aggiornato la domanda. –

+0

Potrebbe esserci TimeZone -10. Quindi il tempo risparmiato è 14:00 il giorno precedente. Quando lavoro con MongoDB, salvi la data come valore lungo in millis – Ilya

+0

Sì, si tratta di un problema di fuso orario. Sono a Brisbane, in Australia. È UTC + 10. [Questa pagina] (https: //jira.mongodb.org/browse/CSHARP-185) dice "MongoDB memorizza tutti i DateTimes in UTC.Tutte le ore locali fornite vengono convertite in UTC quando memorizzate nel database". E ho trovato dopo l'inserimento quando interrogare le date da MongoDB tramite la sua API Java, le date vengono convertite nuovamente in ora locale. Quindi va bene ora. Grazie. –

1

Mongo memorizza le date in millisecondi dall'epoca Unix.

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

Quindi non avete qualsiasi fuso orario. Tuttavia, se si utilizza la console, il parser .js sta convertendo le date UTC nelle impostazioni correnti del fuso orario del sistema.

È possibile verificare che:

  • Creare un'entità con alcuni dati Data.
  • quindi interrogarlo tramite la console. (Uso String())
  • quindi uscire la console e riconfigurare il fuso orario del sistema (Debian/Ubuntu: sudo dpkg-reconfigure tzdata)
  • quindi inserire di nuovo la console ed eseguire query i vecchi dati => si ottiene lo stesso UTC ma diversi toString() emette
0

Si potrebbe verificare il fuso orario UTC, in fondo mongo server in esecuzione a seconda UTC fuso orario

formato SimpleDateFormat = new SimpleDateFormat ("dd/MM/yyyy"); format.setTimeZone (TimeZone.getTimeZone ("UTC"));