1
resposta

Por que as datas com new Date, ficam um valor errado no banco ?

Por que as datas com new Date, ficam um valor errado no banco. Ao criar e/ou fazer update, o valor no banco fica todo errado, qual o jeito certo de usar, ok ei sei que o mês começa com 0, ao invés de 1, mas e o ano ? Estou usando o MongoDB 4.4.5(Visualizando o banco no Compass 1.26.1), notei também o mesmo problema ao usar o VS Code,

alunos.updateOne(
                Filters.eq("nome", "Patricia"), 
                new Document("$set", new Document("data_nascimento", new Date(1993, 10, 10))));

Abaixo o retorno no banco.

id : 6080a27223a3111bcc032690 nome : "Patricia" datanascimento : 3893-11-10T03:00:00.000+00:00

1 resposta

Olá Ariany! Tudo bem?

Como você mencionou, o mês começa em 0 e vai até 11, e o ano é representado pelo número de anos desde 1900. Além disso, o horário é representado em UTC. O problema ocorre porque no construtor da classe Date do Java, o ano deve ser especificado com o valor atual menos 1900. Portanto, ao criar uma nova data com new Date(1993, 10, 10), o ano real se torna 1993 - 1900 = 93.

Além disso, a classe Date do Java também considera o mês com base em um índice zero, ou seja, janeiro é representado por 0, fevereiro por 1, e assim por diante.

Para evitar esses problemas, uma alternativa é utilizar o método ISODate() do MongoDB. Ele permite que você insira uma data no formato ISO 8601, que é mais fácil de entender e manipular.

Por exemplo:

alunos.updateOne(
    Filters.eq("nome", "Patricia"), 
    new Document("$set", new Document("data_nascimento", ISODate("1993-11-10T00:00:00.000Z")))
);

Dessa forma, você consegue inserir a data correta no banco, sem se preocupar com as particularidades do construtor new Date().

Espero ter ajudado e bons estudos!