问题 在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()构造函数。
答案 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