6

在 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")。

两者都应该根据文档返回一个 ISODate并且在我看来应该是相同的。有谁知道他们为什么不这样做以及这是错误还是功能?

4

1 回答 1

5

在内部,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上的文档略微暗示了这一点。

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

于 2013-07-24T12:46:32.423 回答