为什么MongoDB shell新ISODate(0001-01-01)返回日期1901-01-01

Mr *_*rok 6 mongodb mongo-shell

在Windows上的MongoDB Shell中,如果运行值为的查询

new ISODate('0001-01-01T00:00:00Z')
Run Code Online (Sandbox Code Playgroud)

它实际上似乎在搜索

new ISODate('1901-01-01T00:00:00Z')
Run Code Online (Sandbox Code Playgroud)

如果直接在Mongo Shell中输入"new ISODate('0001-01-01T00:00:00Z')",则可以看到此转换发生时返回ISODate("1901-01-01T00:00:00Z").

奇怪的是,当您使用"新日期"代替"新ISODate"时输入:

new Date('0001-01-01T:00:00:00Z')
Run Code Online (Sandbox Code Playgroud)

它返回正确的ISODate("0001-01-01T00:00:00Z").

两者都应该根据文档返回ISODate,并且在我看来应该采取相同的行为.有谁知道他们为什么不这样做,是否是一个错误或功能?

Der*_*ick 5

在内部,new ISODate真的意味着:

Date.UTC(year, month, date, hour, min, sec, ms);
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

那么四位数年份0001不会被解析或解释,但是当你像MongoDB一样使用它时:

Date.UTC( parseInt("0001") )
Run Code Online (Sandbox Code Playgroud)

然后适用00-99岁的特殊规则.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Date_instances上的文档略微暗示了这一点.

已经在https://jira.mongodb.org/browse/SERVER-8164上有一张MongoDB服务器票,请投票支持.