2017-01-06 2 views
0

Вопрос При анализе строки в качестве даты в MongoDB рекомендуется использовать реализацию?MongoDB Date and ISODate Parsing

Я спрашиваю об этом, потому что у нас есть поставщики, отправляющие нам строковое представление даты в формате «2017-01-01» и «2017/01/01». Я бы подумал, что разбор этих разных строк вернет тот же результат в MongoDB, используя Date() и ISODate().

Учитывая следующие примеры пробегая MongoChef против 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")) 

дает следующие результаты

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 

Это не имеет никакого смысла для меня. Любой, кто мог бы объяснить это мне, был бы очень благодарен.

Единственное, что приемлемо для меня, это вариант № 2, поэтому я гарантирую, что наши даты разделены «/» и используют новый конструктор Date().

ответ

1

"2017-01-01" и "2017/01/01". Чтобы он был коротким, первый, формат ISO, поэтому он будет анализировать время UTC, а второй, не-ISO-формат, будет анализироваться во времени в локальном часовом поясе.

Рассмотрите выход в оболочке Mongo. Все время отображается в 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 сохраняет все даты в UTC

Mongo chef преобразует все указанные выше сохраненные значения времени UTC в местный часовой пояс (-06: 00 offset), только для целей отображения.

Таким образом, выбор между ISODate("2016-01-01T00:00:00Z") и ISODate("2016-01-01T06:00:00Z").

Оба являются временем UTC. Похоже, что вас интересует только дата (часть времени установлена ​​до полуночи), вариант 2 (new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z")) был бы вашим выбором, и все запросы на сортировку будут работать нормально, пока вы создаете дату так же, как вы делали при сохранении.

Ссылка:

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

Смежные вопросы