2017-01-06 3 views
0

Frage Wenn die Zeichenfolge in MongoDB als Datum analysiert wird, was ist die empfohlene Implementierung?MongoDB Datum und ISODate Parsing

Ich frage das, weil wir Lieferanten haben, die uns die Zeichenkettedarstellung eines Datums im Format "2017-01-01" und "2017/01/01" schicken. Ich hätte gedacht, dass das Parsen dieser verschiedenen Strings das gleiche Ergebnis in MongoDB mit dem Date() und ISOdate() zurückgeben würde.

die folgenden Beispiele gegeben durch MongoChef gegen 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")) 

Erzeugt die folgenden Ergebnisse

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 date 

Das macht keinen Sinn für mich läuft. Jeder, der mir das erklären könnte, wäre sehr dankbar.

Der eine, der für mich akzeptabel ist, ist Option # 2, so dass ich sicherstellen, dass unsere Daten alle durch "/" getrennt sind und den neuen Konstruktor Date() verwenden.

Antwort

1

"2017-01-01" und "2017/01/01". Um es kurz zu halten: Erstens, ein ISO-Format, so dass es auf die UTC-Zeit analysiert wird, und zweitens, ein Nicht-ISO-Format, analysiert die Zeitzone in der lokalen Zeitzone.

Betrachten Sie die Ausgabe in Mongo-Shell. Alle Zeiten werden in UTC-Zeit angezeigt.

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 speichert alle Daten in UTC-Zeit.

Mongo chef wandelt alle oben gespeicherten UTC-Datumswerte in die lokale Zeitzone um (-06: 00-Offset), nur zu Anzeigezwecken. Die Wahl liegt zwischen ISODate("2016-01-01T00:00:00Z") vs ISODate("2016-01-01T06:00:00Z").

Beide sind UTC-Datumsangaben. Angenommen, Sie sind nur an einem Datumsteil interessiert (die Zeit ist auf Mitternacht eingestellt), dann ist die Option 2 (new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z")) die richtige Wahl, und alle Vergleichsanfragen funktionieren einwandfrei, solange Sie das Datum auf die gleiche Weise erstellen beim Speichern.

Referenz:

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