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

Posted

技术标签:

【中文标题】检查 mongodb 中的日期时间对象是不是为 UTC 格式或不是来自 python【英文标题】:Checking if a datetime object in mongodb is in UTC format or not from python检查 mongodb 中的日期时间对象是否为 UTC 格式或不是来自 python 【发布时间】:2011-10-14 09:09:08 【问题描述】:

mongodb 中,名为joining_date 的字段显示为

"Sun Dec 19 2010 05:35:55 GMT+0000 (UTC)"

如您所见,这是 UTC 日期。

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

 datetime.datetime(2010, 12, 19, 5, 35, 55, 286000)

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

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

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

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

【问题讨论】:

您的日期是存储为字符串还是日期对象在 mongodb 中? pymongo 可以自动将字符串“编组”为日期对象吗? 【参考方案1】:

由 pymongo 返回的datetime 对象始终表示 UTC 时间,就像存储在 MongoDB 中的日期始终存储为(即假定为)UTC。

如果您在创建Connection 时将tz_info 标志设置为True,pymongo 可以自动将您的datetimes 转换为时区感知。然后,您可以根据需要使用datetimes astimezone() 方法转换到另一个时区。

【讨论】:

tz_info 标志应该是tz_aware吗? @alswl, tz_info 应该是 True。【参考方案2】:

引用 PyMongo 文档:

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

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

>>> v.astimezone(pytz.timezone("US/Eastern"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime

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

v = datetime(2010, 12, 19, 5, 35, 55, 286000, pytz.utc)
v.tzinfo == pytz.utc # Returns True

【讨论】:

我不确定您正在阅读哪个版本的 pymongo 文档,但从 1.8 开始,pymongo 可选择支持返回时区感知 datetimes。在当前版本 (2.0) 中,您可以在使用 tz_aware 参数(接受布尔值)创建 Connection 时进行设置。当tz_awareTrue 时,所有datetimes 仍以UTC 格式返回,但将tzinfo 设置为固定偏移量(0)。

以上是关于检查 mongodb 中的日期时间对象是不是为 UTC 格式或不是来自 python的主要内容,如果未能解决你的问题,请参考以下文章

如何检查变量是不是是 Ruby 中的日期或时间或日期时间?

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

从R在mongodb中插入json日期对象

Python:如何检查日期是不是不明确?

如何检查Excel中的日期单元格是不是为空?

如何从存储在 mongodb 中的对象中获取日期?