Python/Mongoengine-保存到数据库时是否缺少时区?

Python/Mongoengine-保存到数据库时是否缺少时区?,python,mongoengine,python-dateutil,Python,Mongoengine,Python Dateutil,使用MongoEngine将日期对象保存到Mongo时遇到问题。这是我的密码: print isodate >>> 2014-07-01T20:00:00.000Z import pytz from dateutil import parser tz = pytz.timezone('Europe/London') start = parser.parse(isodate).replace(tzinfo=None) start = tz.localize(start) p

使用MongoEngine将日期对象保存到Mongo时遇到问题。这是我的密码:

print isodate
>>> 2014-07-01T20:00:00.000Z

import pytz
from dateutil import parser

tz = pytz.timezone('Europe/London')
start = parser.parse(isodate).replace(tzinfo=None)
start = tz.localize(start)

print start
>>> 2014-07-01 20:00:00+01:00
本地化日期似乎效果不错,但保存到Mongo时:

f = Fixture(
    start=start
)
当我看到创建的Mongo文档时,出现了以下奇怪的情况:

{
  _id: ObjectId("53b1dfbde20b47102c824a8f"),
  start: ISODate("2014-07-01T19:00:00Z")
}

有什么原因导致时间缩短两小时,时区不再存在吗?

我觉得您误解了日期时间格式。参考:

  • 时间以UTC(协调世界时)表示,带有特殊的UTC指示符(“Z”)
  • 时间以当地时间表示,时区偏移以小时和分钟表示。时区偏移“+hh:mm”表示日期/时间使用的本地时区比UTC早“hh”小时“mm”分钟。时区偏移“-hh:mm”表示日期/时间使用的本地时区比UTC晚“hh”小时“mm”分钟
  • “2014-07-01T20:00:00.000Z”应等于“2014-07-0121:00:00+01:00”。所以在本地化datetime时出错了,而不是保存到Mongo

    如果要将“…T…Z”转换为本地时间,可以尝试以下操作:

    print isodate
    >>> 2014-07-01T20:00:00.000Z
    import pytz
    from dateutil import parser
    local_tz = pytz.timezone('Europe/London')
    local_time = parser.parse(isodate).astimezone(local_tz)
    print local_time
    >>> 2014-07-01 21:00:00+01:00
    
    如果您需要在本地时间执行日期算术,请再执行一个步骤(请参阅:):


    实际上,您可以直接将“…T…Z”ISODate保存到Mongo,而无需转换为本地时间。因为它已经包含时区信息,所以不需要转换。

    时间不会缩短两个小时
    19:00:00Z
    20:00:00+01:00
    是同一时间
    Z
    是UTC时区,即
    +00:00
    local_tz.normalize(local_time)