Почему оболочка MongoDB new ISODate (0001-01-01) возвращает дату 1901-01-01

В MongoDB Shell в Windows, если вы запустите запрос со значением

new ISODate('0001-01-01T00:00:00Z')

на самом деле кажется, что он ищет

new ISODate('1901-01-01T00:00:00Z')

Если вы введете «новый ISODate ('0001-01-01T00: 00: 00Z')» непосредственно в Mongo Shell, вы увидите, что это преобразование происходит, поскольку оно возвращает ISODate («1901-01-01T00: 00: 00Z»).

Как ни странно, когда вы используете «новую дату» вместо «новая ISODate», вводя:

new Date('0001-01-01T:00:00:00Z')

он возвращает ISODate ("0001-01-01T00: 00: 00Z"), что является правильным.

Оба должны возвращать ISODate в соответствии с документами и, на мой взгляд, должны действовать одинаково. Кто-нибудь знает, почему они этого не делают, и это ошибка или особенность?


person Mr Grok    schedule 24.07.2013    source источник


Ответы (1)


На самом деле new ISODate означает:

Date.UTC(year, month, date, hour, min, sec, ms);

IE, MongoDB разбивает строку на элементы с помощью регулярного выражения (строка 60 в https://github.com/mongodb/mongo/blob/master/src/mongo/shell/types.js#L56)

У объекта JavaScript Date есть несколько разных инициализаторов (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax). Если вы используете:

new Date("0001-01-01T:00:00:00");

Тогда четырехзначный год 0001 не анализируется и не интерпретируется, но когда вы используете его, как это делает MongoDB:

Date.UTC( parseInt("0001") )

Затем применяются особые правила для лет 00-99. Документы на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Date_instances слегка намекают на это.

Билет сервера MongoDB уже есть на https://jira.mongodb.org/browse/SERVER-8164, проголосуйте за него.

person Derick    schedule 24.07.2013