MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como inserir a mesma data no mongodb lida de String através de java?


Há dois problemas com o que você está tentando fazer no momento:
  1. Você tem um erro de digitação na segunda linha de código, o que significa que seus meses estão sendo analisados ​​como minutos
  2. Como mencionado, você não está levando em consideração o fuso horário.

Para resolver o primeiro problema, você precisa mudar
Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);

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

Os formatos de data diferenciam maiúsculas de minúsculas. O que você estava tentando fazer era analisar o mês como **m**inuto em vez de **M**onth. No teste que fiz, isso significava que todos os meses estavam saindo como janeiro, o que posso ver que estava acontecendo no seu exemplo também. Além disso, noto que sua primeira linha de código, o formatador (que está configurado corretamente) não é usado.

O segundo problema é que sim, Java Date s não se comportam da maneira que você espera. Eles DEVEM ter um componente de tempo, mesmo que você não se importe com isso simplesmente pela data. Além disso, eles devem ter um fuso horário, pois têm um horário.

Você pode não ter a opção de mudar para a biblioteca Joda superior; nesse caso, existem maneiras de contornar isso. Eu escrevi um teste que deve demonstrar isso:
@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"));
}

Então você pode ver que eu usei o formato correto, mas também configurei seu fuso horário para UTC (para que ele tenha um deslocamento de zero e sem horário de verão). Então, quando você analisar a data com este formatador, a data sairá com uma hora que é meia-noite no fuso horário UTC. Como meu computador está na Europa, quando imprimo esta data, mostra um horário de 2h, pois esse fuso horário está 2 horas à frente do UTC. Mas quando eu uso o obsoleto toGMTString método, o tempo sai como zero.

Quando você armazena essa data no MongoDB usando o driver Java, ele salvará a data, a hora e o fuso horário com ela, mesmo que tudo o que importa seja a data. O que você precisará fazer quando ler as datas novamente é lembrar que elas estão em UTC e definir o fuso horário adequadamente.

Alternativamente, você pode armazená-los no MongoDB sem alterar o fuso horário, desde que você sempre os leia e escreva no mesmo fuso horário. Mas isso está repleto de bugs inesperados quando a) lidar com horários acima da meia-noite eb) o horário de verão entra em ação (ou para).

Ou apenas use Joda-Time .