如果您运行值为
的查询,则在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,在我看来应该采取相同的行动。有谁知道他们为什么不这样做,是否是一个错误或一个功能?
答案 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服务器票证,请投票支持。