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



我正在开发一个应用程序来管理物联网设备的操作轮班,可以在地球上任何地方使用不同的时区,我使用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或当地时区的日期,但有变化。这个bug对我正在开发的系统来说可能是至关重要的。

有没有人知道可能会发生什么,如果它是当前版本中的某种错误?我使用python 3.8.5, pymongo 3.11.3和mongodb 4.4.4

我到处都在看这个问题,但似乎我是唯一一个发生的,在本地添加或减去时差不是一个选项,我想我将不得不选择使用时间戳来避免这个问题或另一个头痛。

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

如果你这样做,你通常需要跟踪两个时区:UTC,它是存储每个时间戳的地方,和一个本地时区,它用于输出和表示。

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

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

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

最后一位并不总是明确记录的。例如,在Ruby中,这里描述了基本驱动程序时区行为,它并没有说所有时间都以本地时区返回。Mongoid文档对时区有更广泛的论述,因为它们是显式可配置的。

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

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

最新更新