按日期过滤时出现Mongodb时区问题

时间:2017-10-07 22:33:47

标签: javascript node.js mongodb date

我正在尝试使用" date" 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,宾果游戏时,会返回记录。

这可能是一个时区问题,但我无法确定何时何地。

1 个答案:

答案 0 :(得分:2)

2017-10-01T23:00:00.000Z是GMT时间。 这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); `