【问题标题】:comparing dates in mongodb比较MongoDB中的日期
【发布时间】:2016-11-19 08:35:20
【问题描述】:

Meteor 服务器代码更新 Mongodb 集合,dateField 的值如下所示
ISODate("2016-11-19T00:00:00Z")

客户端选择了dateStartdateFinish,看起来像这样
$('input[name="startDateStr"]').val() // => "2016-11-19"

所以我转换了用户条目,以便我可以使用它来获取与以下 mongodb 查询匹配的dateField 的文档;

dateToISO: (date) => { // date format in YYYY-MM-DD
  const dArr = date.split('-');
  return new Date(parseInt(dArr[0]), parseInt(dArr[1]) - 1, parseInt(dArr[2]));
}

然后将结果以格式为 DD/MM/YYYY 的日期呈现给用户

      let start = utility.dateToISO(dict.get('inquiryStartDate'));
      let end = utility.dateToISO(dict.get('inquiryEndDate'));

////Both of the above prints: Sat Nov 19 2016 00:00:00 GMT+1100 (AEDT)

     return myCol.find({
        date: {
          $gte: start,
          $lte: end
        }
      }, {
        transform: function(doc) {
          doc.date = moment(doc.date).format('DD/MM/YYYY');
          return doc;
        }
      });

尽管存在一些文档事件,但代码未能返回任何文档事件。知道为什么以及如何解决它吗?

【问题讨论】:

  • 您在代码中注释Both of the above prints: Sat Nov 19 2016 00:00:00 GMT+1100 (AEDT),这样只有日期字段的值与Sat Nov 19 2016 00:00:00 GMT+1100 (AEDT) 完全相同的文档才会被返回。
  • 当您从查询中删除 $lte:end 时它是否有效?
  • @Khang 为了进行这种压缩,最好将一个日期转换为另一个日期的格式是什么?现在确定这是否是问题所在,因为如果日期值发生变化,相同的代码可以正常工作。
  • @Veeram 是的,它确实有效。但我不明白为什么以及如何解决它。

标签: mongodb date datetime meteor


【解决方案1】:

新的 Date(year, month, date) 变体将具有当前系统时区中的日期。

比较没有返回任何结果的原因是当您在本地系统区域中传递日期时,流星会从本地日期时间转换为 UTC 日期时间,因为 Mongo DB 日期时间是 UTC 时间。因此,您的输入日期从 2016 年 11 月 19 日星期六 00:00:00 GMT+1100 (AEDT) 变为 2016 年 11 月 18 日星期五 01:00:00 UTC。

将用户输入的日期视为 UTC。您只需将日期明确解析为 UTC。

试试

new Date(Date.UTC(2016, 11, 19, 0, 0, 0, 0)

并将其传递给查询。

【讨论】:

    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多