提问者:小点点

Mongodb和Node.js datetime时区问题


我很难理解在MongoDB/node.js中查询日期的概念,即使在阅读了Google中的许多SO和其他文章之后也是如此。

同时存储来自react DatePicker的日期 ;在mongodb中,它会根据我的时间区域少存储一天 ;但当它被提取时,它显示为相同的,我可以理解它再次被转换为区域设置

但是查询是如何响应的呢?

当我查询时 ;node.js/mongoose中的mongodb--我没有找到正确的结果,所以我的问题是在查询mongodb时--日期是如何传递给mongodb的?例如:

post.find({publish_date:{$GTE:new Date()}}

服务器的新日期值-localtime zone是什么?或 ;浏览器?

新的日期值是在比较数据库时转换为utc还是作为从服务器传递的数据进行比较?

我有一个post模型,我希望在published_date根据我的时区发布post。

例如-如果我将2021-01-21 mongo存储2021-01-20t18:30:00.000+00:00-可以理解它存储为UTC

现在当我在查询发布的帖子时,服务器的日期/时间是2021-01-21-它不是提取任何文档!

当我将publish_date更改为2021-01-22时,mongo存储2021-01-21T18:30:00.000+00:00,然后查询在文档上生成。

我不知道如何解决这个问题

这方面的任何帮助都是有帮助的

多谢了。


共1个答案

匿名用户

在MongoDB中,所有date值都仅存储为UTC时间。

如果需要,客户端应用程序负责将这些UTC时间显示为本地时间。

MongoDB不保留输入时区,如果您出于任何原因需要它,那么您必须将它存储在一个单独的字段中。

在Mongo中,可以使用$dateToString显示本地日期/时间值:

{ $dateToString: {
    date: <dateExpression>,
    format: <formatString>,
    timezone: <tzExpression>,
    onNull: <expression>
} }

每当需要处理日期/时间值时,我推荐使用moment.js库。

查询可以是这样的,例如:

{ $gte: moment().startOf('day').toDate() }

我在瑞士,那里有UTC+01:00,因此moment().startof('day').todate()返回isodate(“2021-01-20T23:00:00Z”)