检查mongodb中的日期时间对象是否为UTC格式,来自python

Jam*_*mes 5 python datetime pytz pymongo

mongodb,一个被调用的字段joining_date显示为

"Sun Dec 19 2010 05:35:55 GMT+0000 (UTC)"
Run Code Online (Sandbox Code Playgroud)

如您所见,这是一个UTC日期.

但是当从pymongo访问时,相同的字段显示为

 datetime.datetime(2010, 12, 19, 5, 35, 55, 286000)
Run Code Online (Sandbox Code Playgroud)

从python我需要检查日期是否为utc格式.

问题:我得到一个奇怪的结果,如下所示

v = datetime(2010, 12, 19, 5, 35, 55, 286000)
v.tzinfo == pytz.utc # Returns False !..why ?
Run Code Online (Sandbox Code Playgroud)

如何Sun Dec 19 2010 05:35:55 GMT+0000 (UTC)从原始字符串中取回datetime.datetime(2010, 12, 19, 5, 35, 55, 286000)或如何检查是否datetime.datetime(2010, 12, 19, 5, 35, 55, 286000)为UTC格式?

dcr*_*sta 11

datetime pymongo返回的对象总是表示UTC的时间,就像存储在MongoDB中的日期总是存储为(即假设为)UTC.

datetime如果您在创建时将tz_info标志设置为,则pymongo可以自动将您的s 转换为时区.然后,您可以根据需要使用s 方法转换为另一个时区.TrueConnectiondatetimeastimezone()

  • `tz_info`标志应该是`tz_aware`吗? (3认同)

Mat*_*kes 1

引用 PyMongo 文档:

\n\n
\n

从服务器检索的所有日期时间(无论您使用什么版本的驱动程序\xe2\x80\x99)都将是幼稚的并代表 UTC。

\n
\n\n

IE v.tzinfo is None。如果您尝试将它们转换为另一个时区,您会收到警告:

\n\n
>>> v.astimezone(pytz.timezone("US/Eastern"))\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nValueError: astimezone() cannot be applied to a naive datetime\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,您可以通过执行以下操作来获取时区感知的日期时间datetime(v.year, v.month, v.day, v.hour, v.minute, v.second, v.microsecond, pytz.utc)。在这种情况下,您的原始代码将起作用:

\n\n
v = datetime(2010, 12, 19, 5, 35, 55, 286000, pytz.utc)\nv.tzinfo == pytz.utc # Returns True\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我不确定您正在阅读的 pymongo 文档是什么版本,但从 1.8 开始,pymongo 可以选择支持返回时区感知的“日期时间”。在当前版本(2.0)中,您可以在使用“tz_aware”参数(接受布尔值)创建“Connection”时设置此项。当“tz_aware”为“True”时,所有“日期时间”仍以 UTC 格式返回,但将“tzinfo”设置为固定偏移量(0)。 (6认同)