Python 使用pymongo创建时区感知的ISODate

Python 使用pymongo创建时区感知的ISODate,python,mongodb,datetime,timezone,pymongo,Python,Mongodb,Datetime,Timezone,Pymongo,我正在寻找一种在mongoDB中存储时区感知的datetime对象的方法 我在这里读到:使用pymongo在MongoDB中存储datetime对象将导致存储ISODate对象(或者从shell查询时看起来像这样的对象) 使用datetime.replace(tzinfo=[…])方法,可以让datetime对象知道其时区。不幸的是,在mongoDB中存储这样的对象时,时区信息似乎丢失了 我的问题是:有没有一种方法可以将时区存储在ISODate对象本身中,这样它看起来像这样:ISODate(“2

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

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

使用
datetime.replace(tzinfo=[…])
方法,可以让datetime对象知道其时区。不幸的是,在mongoDB中存储这样的对象时,时区信息似乎丢失了

我的问题是:有没有一种方法可以将时区存储在ISODate对象本身中,这样它看起来像这样:
ISODate(“2012-07-14T01:00:00+01:00”)
在查询shell时,这样datetime对象在稍后使用pymongo重新加载时仍然可以识别时区


非常感谢你的帮助

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

您可以考虑将它作为字符串存储在一个辅助字段中,这样您仍然可以在知道本地时间和偏移的情况下及时查询该时刻。


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

此外,如果时区规则在tzdata版本之间发生了更改,那么ISODate+“欧洲/伦敦”不足以恢复本地时间,也就是说,如果您希望本地时间保持原样,则存储时区信息(utc偏移量,tzname)显式。注意:
tz_aware=True
使驱动程序将utc时间作为aware datetime对象返回。要获取本地时间:
utc_time.astimezone(pytz.timezone('Europe/London'))
(注意:它使用与安装
pytz
版本相对应的时区规则)这很有意义,谢谢大家。我希望通过使用一个ISODate字段,能够使用日期聚合运算符执行时区感知mongodb查询。但现在看来,我除了将偏移量存储在单独的字段(将在查询中使用)之外,别无选择,以及另一个字段中的时区标识符,以在应用程序服务器检索数据后保持datetime对象时区感知。相关:
from datetime import datetime
from dateutil.tz import *

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