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

时间:2013-07-24 12:15:42

标签: mongodb mongo-shell

如果您运行值为

的查询,则在Windows上的MongoDB Shell中
new ISODate('0001-01-01T00:00:00Z')

它实际上似乎在搜索

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

如果直接在Mongo Shell中输入“new 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”)。

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

1 个答案:

答案 0 :(得分:5)

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

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

IE,MongoDB将字符串拆分为带有正则表达式的元素(https://github.com/mongodb/mongo/blob/master/src/mongo/shell/types.js#L56处的第60行)

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的文档稍微暗示了这一点。

已经有https://jira.mongodb.org/browse/SERVER-8164的MongoDB服务器票证,请投票支持。