Pregunta Al analizar cadenas como fechas en MongoDB, ¿cuál es la implementación recomendada?
Pregunto esto porque tenemos proveedores que nos envían la representación de cadena de una fecha en el formato "2017-01-01" y "2017/01/01". Hubiera pensado que el análisis de esas diferentes cadenas arrojaría el mismo resultado en MongoDB usando Date() e ISODate().
Dados los siguientes ejemplos que se ejecutan a través de MongoChef contra MongoDB 3.4
1. print(new Date("2016-01-01")) 2. print(new Date("2016/01/01")) 3. print(new ISODate("2016-01-01")) 4. print(new ISODate("2016/01/01"))Produce los siguientes resultados
1. Thu Dec 31 2015 18:00:00 GMT-0600 (Central Standard Time) 2. Fri Jan 01 2016 00:00:00 GMT-0600 (Central Standard Time) 3. Thu Dec 31 2015 18:00:00 GMT-0600 (Central Standard Time) 4. 2017-01-06T10:34:01.814-0600 E QUERY [thread1] Error: invalid ISO dateEsto no tiene ningún sentido para mi. Cualquiera que pueda explicarme esto sería muy apreciado.
La que es aceptable para mí es la opción n. ° 2, así que me aseguro de que nuestras fechas estén separadas por "/" y estén usando el nuevo constructor Date().
"2017-01-01" y "2017/01/01" . Para abreviar, el primero, un formato ISO, por lo que analizará la hora UTC y el segundo, un formato no ISO, analizará la hora en la zona horaria local.
Considere la salida en el shell de Mongo. Todos los tiempos se muestran en hora UTC.
1.new Date("2016-01-01") ---- ISODate("2016-01-01T00:00:00Z") 2.new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z") 3.new ISODate("2016-01-01") ---- ISODate("2016-01-01T00:00:00Z") 4.new ISODate("2016/01/01") ----2017-01-06T11:14:56.862-0600 E QUERY [thread1] Error: invalid ISO date :Mongo db guarda todas las fechas en horario UTC.
Mongo chef transforma todos los valores de fecha y hora UTC guardados anteriormente a la zona horaria local (compensación de -06:00), solo con fines de visualización.
Entonces, la elección es entre ISODate("2016-01-01T00:00:00Z") vs ISODate("2016-01-01T06:00:00Z") .
Ambos son fechas y horas UTC. Parece que solo está interesado en la parte de la fecha (con la parte de la hora establecida en la medianoche), la opción 2 ( new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z") ) sería su elección y todas las consultas de comparación funcionarán bien siempre que cree la fecha de la misma manera que lo hizo al guardar.
Referencia:
https://docs.mongodb.com/manual/reference/bson-types/#document-bson-type-date
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date