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

为什么MongoDB shell新ISODate(0001-01-01)返回日期1901-01-01,mongodb,mongo-shell,Mongodb,Mongo Shell,在windows上的MongoDB Shell中,如果运行值为的查询 new ISODate('0001-01-01T00:00:00Z') 它实际上似乎在寻找 new ISODate('1901-01-01T00:00:00Z') 如果您直接在Mongo Shell中输入“新的ISODate('0001-01-01T00:00:00Z'),您可以在返回ISODate(“1901-01-01T00:00:00Z”)时看到此转换发生 奇怪的是,当您使用“新日期”而不是“新ISODate”时,请

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

new ISODate('0001-01-01T00:00:00Z')
它实际上似乎在寻找

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

奇怪的是,当您使用“新日期”而不是“新ISODate”时,请输入:

new Date('0001-01-01T:00:00:00Z')
它返回正确的ISODate(“0001-01-01T00:00:00Z”)


两者都应该返回一个ISODate,根据我的想法,它们的行为应该是相同的。有人知道他们为什么不知道,这是一个bug还是一个特性吗?

在内部,
新的ISODate
实际上意味着:

Date.UTC(year, month, date, hour, min, sec, ms);
也就是说,MongoDB使用正则表达式将字符串拆分为元素(第60行)

JavaScript日期对象有几个不同的初始化器()。如果您使用:

new Date("0001-01-01T:00:00:00");
然后四位数年份
0001
不会被解析或解释,但当您像MongoDB一样使用它时:

Date.UTC( parseInt("0001") )
然后,特殊规则适用于00-99年。文档中有一点暗示了这一点

已存在MongoDB服务器票证,请投票支持