问题 在 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"))
Run Code Online (Sandbox Code Playgroud)
产生以下结果
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
Run Code Online (Sandbox Code Playgroud)
这对我来说没有任何意义。任何可以向我解释这一点的人都将不胜感激。
对我来说可以接受的是选项 #2,所以我确保我们的日期都用“/”分隔,并使用 new Date() 构造函数。
"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 :
Run Code Online (Sandbox Code Playgroud)
Mongo db 以 UTC 时间保存所有日期。
Mongo Chef 将上述所有保存的 UTC 日期时间值转换为本地时区(-06:00 偏移),仅用于显示目的。
所以选择是在ISODate("2016-01-01T00:00:00Z")vs之间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
| 归档时间: |
|
| 查看次数: |
13526 次 |
| 最近记录: |