gpt4 book ai didi

mongodb - MongoDB 上的时区查询

转载 作者:行者123 更新时间:2023-12-05 05:06:04 63 4
gpt4 key购买 nike

我正在构建一个应用程序,其中用户可以位于不同的时区,并且我运行的查询对他们的时区很敏感。

我遇到的问题是 MongoDB 似乎在查询时忽略了时区!

这是日期字段“2019-09-29T23:52:13.495000+13:00”的示例,这是完整的 json: enter image description here

这是一个查询示例:

{
"at": {
"$gte": "2019-09-29T00:00:00+00:00",
"$lte": "2019-09-30T00:00:00+00:00"
}
}

我的所有日​​期都保存为 +12 或 +13,因为这些是我的客户目前所在的时区,基本上这对上述查询意味着我应该看到 2019-10 的一些结果-01:00:00:00+13:00 因为 10 月 1 日在 UTC 中仍然是 9 月 30 日,而我不是。

我是这方面的新手,而且还不太了解这个问题,所以我愿意接受重构/改变想法,如果这会让事情变得更容易的话。

对于上下文,以防万一我使用 PyMongo,我的 MongoDB 版本是 4.2

编辑!我尝试将“at”字段转换为日期,但时区似乎已被抑制或不可见 enter image description here

因此,我还必须更改查询方式

{ "at": { 
"$gte": ISODate("2019-09-29T00:00:00+00:00"),
"$lte": ISODate("2019-09-30T00:00:00+00:00")
}
}

没有帮助

最佳答案

MongoDB 在存储日期时使用 UTC 时区。使用您的示例日期:

> ISODate("2019-09-29T23:52:13.495000+13:00")
ISODate("2019-09-29T10:52:13.495Z")

所以 +13:00 时区被 ISODate() 转换为 Z (UTC) 时区,这就是存储的值在数据库中。

> db.test.insert({_id:0, at: ISODate("2019-09-29T23:52:13.495000+13:00")})

> db.test.find()
{ "_id" : 0, "at" : ISODate("2019-09-29T10:52:13.495Z") }

请注意,“at”是以 UTC 时间存储的,而不是插入的 +13

根据您的示例使用 ISODate() 进行查询按预期工作:

> db.test.find({ "at": {
... "$gte": ISODate("2019-09-29T00:00:00+00:00"),
... "$lte": ISODate("2019-09-30T00:00:00+00:00")
... }
... })
{ "_id" : 0, "at" : ISODate("2019-09-29T10:52:13.495Z") }

由于您使用的可视化工具,时区信息不可见。它在 mongo shell 中显示为 Z,如上例所示。

存储 UTC 的优点是您可以将它们转换为任何其他时区,而不必担心夏令时。有处理时区并在它们之间进行转换的特定于日期的聚合运算符。参见 Date Expression Operatorshttps://stackoverflow.com/a/48535842/5619724例如。

关于mongodb - MongoDB 上的时区查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60180714/

63 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com