javascript - 按日期过滤时Mongodb时区问题

标签 javascript node.js mongodb date

我正在尝试获取开始日期和结束日期之间带有“日期”字段的所有记录。

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

 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 点时,宾果,将返回记录。

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

最佳答案

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); `

关于javascript - 按日期过滤时Mongodb时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46625758/

相关文章:

node.js - 用于传感器数据收集的 MongoDB 查询

javascript - 具有多个下拉列表的 Angular 过滤器

javascript - 如何查找加载页面所花费的时间

node.js - 如何将表单数据从 Angular 传递到nodejs

javascript - 从来自 MongoDB 的数据中使用 jquery 按名称排序

MongoDB:通过嵌套数组中的最后一个元素值获取文档

php - 如何将数据从 JavaScript 传输到 PHP?

javascript - 如何找到文本选择的顶部父元素?

node.js - 如果我每 10 秒添加一条记录,是否应该保持 MongoDB 连接处于事件状态?

node.js - for 循环与 foreach