sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo insertar la misma fecha en mongodb que se lee desde String a través de Java?

Hay dos problemas con lo que estás tratando de hacer actualmente:

  1. Tiene un error tipográfico en la segunda línea de código, lo que significa que sus meses se analizan como minutos
  2. Como se mencionó, no está teniendo en cuenta la zona horaria.

Para abordar el primer problema, debe cambiar

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

a

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

Los formatos de fecha distinguen entre mayúsculas y minúsculas, lo que estaba tratando de hacer es analizar el mes como un **m**inuto en lugar de un **M**mes. En la prueba que ejecuté, eso significaba que todos los meses salían como enero, lo que puedo ver que también estaba sucediendo en su ejemplo. Además, noté que su primera línea de código, el formateador (que está configurado correctamente) no se usa.

El segundo problema es que sí, Java Date s no se comportan de la manera que esperas. DEBEN tener un componente de tiempo, aunque no le importe simplemente la fecha. Además, deben tener una zona horaria ya que tienen una hora.

Es posible que no tenga la opción de pasar a la biblioteca superior de Joda, en cuyo caso hay formas de solucionar este problema. He escrito una prueba que debería demostrar esto:

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

Entonces puede ver que he usado el formato correcto, pero también configuré su zona horaria en UTC (por lo que tiene una compensación de cero y no tiene horario de verano). Luego, cuando analice la fecha con este formateador, la fecha aparecerá con una hora que es medianoche en la zona horaria UTC. Debido a que mi computadora está en Europa, cuando imprimo esta fecha, muestra una hora de 2 am, porque esta zona horaria está 2 horas por delante de UTC. Pero cuando uso el obsoleto toGMTString método, el tiempo sale como cero.

Cuando almacena esta fecha en MongoDB usando el controlador Java, guardará la fecha, la hora y la zona horaria con él, incluso si lo único que le importa es la fecha. Lo que deberá hacer cuando vuelva a leer las fechas es recordar que están en UTC y configurar la zona horaria de manera adecuada.

Alternativamente, puede almacenarlos en MongoDB sin cambiar la zona horaria, siempre que siempre los lea y los escriba en la misma zona horaria. Pero esto está plagado de errores inesperados cuando a) se trata de horas superiores a la medianoche yb) el horario de verano entra en acción (o se detiene).

O simplemente use Joda-Time .