【问题标题】:Why MongoDB shell new ISODate(0001-01-01) returns date 1901-01-01为什么 MongoDB shell new ISODate(0001-01-01) 返回日期 1901-01-01
【发布时间】:2013-07-23 21:59:27
【问题描述】:

如果您运行值为

的查询,则在 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,在我看来应该是相同的。有谁知道他们为什么不这样做以及这是错误还是功能?

【问题讨论】:

    标签: mongodb mongo-shell


    【解决方案1】:

    在内部,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服务器票,请投票。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-06
      • 2015-12-31
      • 2021-02-17
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多