MongoDB日期和ISODate解析

时间:2017-01-06 17:05:53

标签: mongodb date

问题 在MongoDB中将字符串解析为日期时,建议实现什么?

我问这个是因为我们有供应商向我们发送日期的字符串表示形式,格式为" 2017-01-01"和" 2017/01/01"。我原以为解析那些不同的字符串将使用Date()和ISODate()在MongoDB中返回相同的结果。

鉴于以下示例针对MongoDB 3.4运行MongoChef

1. print(new Date("2016-01-01"))
2. print(new Date("2016/01/01"))
3. print(new ISODate("2016-01-01"))
4. print(new ISODate("2016/01/01"))

产生以下结果

1. Thu Dec 31 2015 18:00:00 GMT-0600 (Central Standard Time)
2. Fri Jan 01 2016 00:00:00 GMT-0600 (Central Standard Time)
3. Thu Dec 31 2015 18:00:00 GMT-0600 (Central Standard Time)
4. 2017-01-06T10:34:01.814-0600 E QUERY    [thread1] Error: invalid ISO date

这对我没有任何意义。任何可以向我解释的人都会非常感激。

对我来说可接受的是选项#2,因此我确保我们的日期全部用" /"并使用新的Date()构造函数。

1 个答案:

答案 0 :(得分:3)

"2017-01-01""2017/01/01"。为了简短起见,第一个是ISO格式,因此它将解析为UTC时间,第二个是非ISO格式,将在本地时区解析为时间。

考虑Mongo shell中的输出。所有时间都以UTC时间显示。

1.new Date("2016-01-01") ---- ISODate("2016-01-01T00:00:00Z")
2.new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z")
3.new ISODate("2016-01-01") ---- ISODate("2016-01-01T00:00:00Z")
4.new ISODate("2016/01/01") ----2017-01-06T11:14:56.862-0600 E QUERY    [thread1] Error: invalid ISO date :

Mongo数据库以UTC时间保存所有日期。

Mongo chef将以上所有已保存的UTC日期时间值转换为本地时区(-06:00偏移),仅用于显示目的。

所以选择在ISODate("2016-01-01T00:00:00Z")ISODate("2016-01-01T06:00:00Z")之间。

两者都是UTC日期时间。看起来你只对日期部分感兴趣(时间部分设置为午夜),选项2(new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z"))将是您的选择,只要您创建日期,所有比较查询都将正常工作你在保存的同时也是这样。

参考:

https://docs.mongodb.com/manual/reference/bson-types/#document-bson-type-date

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date