问题当在MongoDB中将字符串解析为日期时,建议实现什么?
我之所以这么问,是因为我们有供应商发送日期的字符串表示,格式为"2017-01-01“和"2017/01/01”。我认为对这些不同字符串的解析将在MongoDB中使用Date()和ISODate()返回相同的结果。
给出了通过MongoChef对MongoDB 3.4运行的以下示例
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()构造函数。
发布于 2017-01-06 17:41:45
"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 :
门戈db保存UTC时间内的所有日期。
Mongo厨师将上述保存的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://stackoverflow.com/questions/41510633
复制相似问题