我使用pymongo在mongodb中存储不同时区的日期时遇到问题

2024-04-23 07:58:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

例如,假设我使用“datetime”库在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或本地时区获取日期,但要有更改。这个bug在我正在开发的系统中可能是至关重要的

如果当前版本中存在某种缺陷,有人知道会发生什么吗? 我使用的是python 3.8.5、pymongo 3.11.3和mongodb 4.4.4

我到处都找过这个问题,但似乎只有我一个人发生了,在本地加上或减去时差不是一个选项,我想我将不得不选择使用时间戳来避免这个问题或另一个头痛


1条回答
网友
1楼 · 发布于 2024-04-23 07:58:20

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

如果这样做,您通常需要跟踪两个时区:UTC(每个时间戳都存储在其中)和本地时区(用于输出和显示)

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

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

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

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

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

无论如何,当您的系统/应用程序时区不是UTC时,使用多个时区确实比应该的困难,我不建议这样做(如果不是为您自己,那么谁都必须在您之后使用您的代码)

相关问题 更多 >