【问题标题】:I have problem storing dates in mongodb with different timezones using pymongo我在使用 pymongo 在具有不同时区的 mongodb 中存储日期时遇到问题
【发布时间】:2021-05-29 22:00:19
【问题描述】:

我正在开发一个应用程序来管理物联网设备的操作变化,这些设备可以在地球上的任何地方使用不同的时区,我正在使用 python、mongodb 和 pymongo。

众所周知,当我们在 mongodb 中存储日期时,它会自动将我们时区的日期转换为 UTC,方法是更改​​时间但保持下面相同的绝对值。

我遇到的问题是,当我使用 pymongo 查询数据库以获取日期时,我得到的日期和时间与 mongodb 中存储的 UTC 日期和时间完全相同,但在我的时区中没有进行转换更改;

例如,假设我在 python 中使用“datetime”库创建了一个日期时间:

MY_TIMEZONE = pytz.timezone('America/Bogota')

datetime.now().astimezone(MY_TIMEZONE)

我在我的时区得到这个日期:

'2021-02-25 00:00:00-05:00'

看看最后的-05:00

当我将该日期保存在 atlas 中的 mongodb 集合中时,它会将日期转换为 UTC,如下所示:

'2021-02-25 05:00:00.000+00:00'

看看最后的+00:00

到目前为止一切顺利,当我使用 pymongo 方法“find_one”查询数据库以获取相同的日期时,问题就来了

我得到的是这样的:

'2021-02-25 05:00:00-05:00'

看看最后的-05:00

与 UTC 相同的时间和日期,但在我的时区,理论上不应该发生,我应该得到 UTC 或本地时区的日期,但会发生变化。这个错误在我正在开发的系统中可能很关键。

如果这是当前版本中的某种错误,有谁知道会发生什么? 我正在使用 python 3.8.5、pymongo 3.11.3 和 mongodb 4.4.4

我到处都看过这个问题,但似乎只有我一个发生了,在本地添加或减去时差不是一个选项,我想我将不得不选择使用时间戳来避免这种情况问题或其他头痛。

【问题讨论】:

标签: python mongodb date datetime pymongo


【解决方案1】:

如果您的应用程序使用多个时区,您应该配置您的系统(通常更可取)或您的应用程序以使用 UTC 作为时区。

如果这样做,您通常需要跟踪两个时区:UTC,即每个时间戳的存储位置,以及一个本地时区,用于输出和演示。

如果您不这样做(即您的系统和/或应用程序时区不是 UTC),您需要跟踪 3 个时区和超过 3 种可能出错的组合:

  • 您的输入所在的时区(是系统时区还是非系统本地时间?)
  • 当您存储时间戳时,它是以 UTC、系统本地时间还是非系统本地时间提供的?

如果您的应用程序使用单个时区,并且您的所有软件都是为此正确构建的,您通常可以假设所有时间都是本地时间并忽略时区。

最后一点并不总是明确记录。例如,在 Ruby 中,基本驱动程序时区行为被描述为here,它并没有说所有时间都以本地时区返回。 Mongoid 文档有一个more extensive treatise 时区,因为它们是明确可配置的。

对于 pymongo,我建议仔细查看整个文档以查找等效语句(并确保您也查看 bson (de)serialization 文档),否则您可能需要阅读源代码以确定行为。

无论如何,当您的系统/应用程序时区不是 UTC 时,使用多个时区确实比应有的困难,我不推荐它(如果不是为您自己,那么任何人都必须与你的代码在你之后)。

【讨论】:

  • 即使只使用 utc 我也有同样的问题,因为 pymongo 默认返回本地时间的日期并出现上述错误,我已经阅读了有关 pymongo 日期和许多第三方来源的文档,但无处可去我是否找到有关此的信息,最后我选择使用时间戳来存储日期,这可以很好地满足我的需要。谢谢回复
  • 根据对问题的评论,在 pymongo 中,关键是在使用 pytz 时在 MongoClient 连接中设置 tz_aware
  • 如果您的系统采用 UTC,那么 pymongo 是否返回幼稚或感知实例都无关紧要。
猜你喜欢
  • 2014-10-24
  • 2016-08-13
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2015-02-13
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多