使用pymongo创建时区感知的ISODate

时间:2015-09-02 17:00:48

标签: python mongodb datetime timezone pymongo

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

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

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

我的问题是:有没有办法将时区存储在ISODate对象本身中,以便它在查询shell时看起来像这样:ISODate("2012-07-14T01:00:00+01:00"),以便日期时间对象仍然可以识别时区后来又重新加载了pymongo?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

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

您可以考虑将其存储为字符串,也许在辅助字段中存储,这样您仍然可以在知道当地时间和偏移的同时查询该时刻。

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

答案 1 :(得分:0)

from datetime import datetime
from dateutil.tz import *

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