2012-08-05 602 views
8

Mi formato de cadena de fecha es así: 2 de enero de 2012 Después del método Instant.parse(), la instancia instantánea se convierte la fecha del 1 de enero de 2012, que es 1 día antes, ¿por qué? Si la cadena de fecha original es Jan 1, 2012, la instantánea será la fecha de dic 31, 2011.fecha en MongoDB: al insertar objetos Fecha en la base de datos Mongo, la fecha se convierte en 1 día anterior a ella

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

estoy usando MongoDB para almacenar estas fechas. Lo he probado y se muestra al formatear la fecha cadena-> instante no hay ningún error. Pero cuando inserto este tipo de objeto de fecha en MongoDB, la cadena de fecha en el MongoDB se convierte en 1 día antes. ¿Por qué?

En MongoDB:

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

¿Ha intentado agregar un componente de zona horaria? Podría ser algo con tu local y la fecha que se compensa con tu zona horaria. –

Respuesta

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

salida es

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

Siguiente para:

final String dateString = "Jan 1, 2012"; 

salida es:

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

Gracias por su respuesta. Sí, la cadena de fecha-> Instantánea no está mal. Es cuando inserto estas fechas en MongoDB, surge este problema. Todavía no sé por qué ... He actualizado la pregunta. –

+0

Puede ser que tengas TimeZone -10. Así que ahorró tiempo si 14:00 día anterior. Cuando trabajo con MongoDB, guardo la fecha como valor largo en milis – Ilya

+0

Sí, es un problema de zona horaria. Estoy en Brisbane, Australia. Es UTC + 10. [Esta página] (https: //jira.mongodb.org/browse/CSHARP-185) dice "MongoDB almacena todos los DateTimes en UTC. Todas las horas locales que usted suministra se convierten a UTC cuando se almacenan en la base de datos". Y descubrí después de insertar cuando consulto las fechas de MongoDB a través de su API de Java, que las fechas vuelven a ser locales. Entonces está bien ahora. Gracias. –

1

Mongo almacena sus fechas en milisegundos desde la época de Unix.

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

para que no tenga cualquier zona horaria. Pero, si usa la consola, el analizador .js está convirtiendo las fechas UTC en la configuración actual de la zona horaria del sistema.

Se puede probar que:

  • crear una entidad con algunos datos de fecha.
  • y luego consultarlo a través de la consola. (Uso de cuerdas())
  • continuación, salir de la consola y volver a configurar la zona horaria del sistema (Debian/Ubuntu: sudo tzdata dpkg-reconfigure)
  • luego indicar la consola de nuevo y consultar sus datos viejos => se obtiene el mismo UTC pero diferente toString() muestra
0

se puede comprobar la zona horaria UTC, básicamente mongo servidor en funcionamiento en función de la zona horaria UTC

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

Cuestiones relacionadas