使用 pymongo 创建时区感知 ISODate

Posted

技术标签:

【中文标题】使用 pymongo 创建时区感知 ISODate【英文标题】:Create timezone-aware ISODate with pymongo 【发布时间】:2015-11-28 07:24:21 【问题描述】:

我正在寻找一种在 mongoDB 中存储时区感知 datetime 对象的方法。

我在这里读到:Create an ISODate with pyMongo 使用 pymongo 在 MongoDB 中存储 datetime 对象将导致存储 ISODate 对象(或从 shell 查询时看起来像这样的对象)

使用datetime.replace(tzinfo=[...]) 方法,有一种方法可以让日期时间对象知道它的时区。不幸的是,在 mongoDB 中存储此类对象时,时区信息似乎丢失了。

我的问题是:有没有办法将时区存储在 ISODate 对象本身中,使其看起来像这样:ISODate("2012-07-14T01:00:00+01:00") 查询 shell 时,因此 datetime 对象在重新加载时仍然是时区感知的pymongo 以后呢?

非常感谢您的帮助!

【问题讨论】:

相关:What is the correct way to handle time zones with PyMongo? 【参考方案1】:

不,没有办法做到这一点。 MongoDB 的 ISODate 只是 Date 对象的包装器,它只是一个时间点,由一个整数表示,该整数对应于自 1970 年 1 月 1 日 UTC 以来经过的毫秒数。它没有办法保留偏移量。

您可能会考虑将其仅存储为字符串,也许在辅助字段中,这样您仍然可以在知道本地时间和偏移量的同时及时查询那个时刻。

另外,假设您使用来自 pytz 或 dateutil 的 tzdb 时区,例如 "Europe/London",您应该认识到无法仅从偏移量确定时区。因此,如果您真的需要重建一个完整的 tz 感知日期时间,那么您还必须将时区标识符存储在一个单独的字段中。

【讨论】:

此外,如果时区规则在 tzdata 版本之间发生变化,则 ISODate + "Europe/London" 不足以恢复本地时间,即,如果您想要本地时间,则存储时区信息( UTC 偏移量,tzname) 显式。 注意:tz_aware=True 使驱动程序将 utc 时间作为可感知的日期时间对象返回。获取本地时间:utc_time.astimezone(pytz.timezone('Europe/London'))(注意:它使用安装pytz版本对应的时区规则) 这很有意义,谢谢你们。我希望能够通过拥有一个 ISODate 字段来使用日期聚合运算符执行时区感知 mongodb 查询。但现在看来,我别无选择,只能将偏移量存储在一个单独的字段中(用于查询),并将时区标识符存储在另一个字段中,以便在应用程序服务器检索到数据后保持 datetime 对象时区感知.【参考方案2】:
from datetime import datetime
from dateutil.tz import *

def to_utc(date_time):
    return date_time.replace(tzinfo=tzlocal()).astimezone(tzoffset(None, 0))

【讨论】:

以上是关于使用 pymongo 创建时区感知 ISODate的主要内容,如果未能解决你的问题,请参考以下文章

pymongo处理ISODate格式日期

无法使用 pymongo 删除 mongodb 文档

mongoDB对时间的处理ISODate与我们时区相差8小时

时区感知 postgres 查询为分钟、小时、天创建时间序列

需要 pymongo 数据帧输出为多行

如何在熊猫中使用 read_csv 将时区感知日期时间作为时区天真的本地 DatetimeIndex 读取?