使用 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的主要内容,如果未能解决你的问题,请参考以下文章
mongoDB对时间的处理ISODate与我们时区相差8小时