【问题标题】:Mongodb timezone issue when filtering by date按日期过滤时的Mongodb时区问题
【发布时间】:2018-03-19 10:36:14
【问题描述】:

我正在尝试获取 startDate 和 endDate 之间“日期”字段的所有记录。

我正在用这个查询数据库(获取从月初到今天的记录):

 var startDate = new Date(2017,09,1); 
    var endDate = new Date(2017,09,7); 

//console.log(startDate) = Sun Oct 01 2017 00:00:00 GMT-0300 (BRT)
//console.log(endDate) = Sat Oct 07 2017 00:00:00 GMT-0300 (BRT)

    Sale.find({date:{"$gte":startDate,"$lt":endDate}},function(err, sales){

    }

日期在 10/02 和 10/07 之间的记录将被退回,但日期为 10/01 的记录不会被退回。以下是这些缺失记录的日期字段:

 "date": {
        "$date": "2017-10-01T23:00:00.000Z"
    }

我将小时设置为 23 以查看是否会有所不同(时区等),但没有。

如果我将 startDate 设置为 9 月 30 日 23 时,什么都没有。 22、21 小时,什么都没有。 当 startDate 变为 9 月 30 日 20 小时宾果游戏时,返回记录。

这可能是一个时区问题,但我无法确定在哪里以及如何。

【问题讨论】:

  • 在 JS 中,new Date(2017,09,1); 返回 Wed Nov 01 2017 00:00:00 GMT-0400 (EDT),因为 0 是一月。但是,这并不能解释您所看到的行为。
  • 您的数据在哪个时区写入 MongoDB? UTC 还是本地?
  • 本地的,但是新的 Date() 对象也应该是本地的吧?我用日期的 console.log 更新了问题。
  • Sun Oct 01 2017 23:00:00 GMT-0300 (BRT) 将是 Sun Oct 02 2017 02:00:00 GMT-0000,因此将其从 2300 移至 1600 并看看会发生什么。
  • 但是 Oct 02 大于 startDate,所以应该返回!

标签: javascript node.js mongodb date


【解决方案1】:

这个2017-10-01T23:00:00.000Z 是格林威治标准时间。 new Date(2017,10,01); 是您的当地时间,当您不在格林威治子午线上时,不等于上述时间。

JS 以自某个基准日期以来的 GMT 秒数存储日期。

所以在第一种情况下,秒数是X,在第二种情况下是X + Date.getTimezoneOffset()

你可以使用这个功能:

function ZDate(year,month,day) {
  return new Date(year + "-" + month + "-" + day);
}

或者按照 RobG 的建议:

function ZDate(year,month,day) {
  return Date.UTC(year, month-1, day); 
}

这里:

var startDate = ZDate(2017,09,1); 
var endDate = ZDate(2017,09,7); `

【讨论】:

  • 我已经更新了我的答案。但是您需要先确定 2017,09,1 对您来说意味着什么。本地 TZ 中的日期,那么您的代码是正确的,或者 2017,09,1 是 GMT,然后使用上面的 ZDate。
  • 请注意,在 ISO 8601 中,仅日期形式不允许使用时区,因此附加的“Z”要么被忽略,要么被视为无效日期。由于 ECMA-262 ed 6,仅日期形式 应该 被视为 UTC(与 ISO 8601 相反),因此 new Date('2017-10-01') 是 UTC。如果您想明确地将其视为 UTC,那么new Date(Date.UTC(y, m-1, d)) 是一种更好的方法(并且避免了内置解析器的变幻莫测)。
猜你喜欢
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
相关资源
最近更新 更多