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

时间:2014-06-30 22:18:18

标签: 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)

print start
>>> 2014-07-01 20:00:00+01:00

本地化日期似乎工作正常,但保存到Mongo时:

f = Fixture(
    start=start
)

当我查看创建的Mongo文档时,会发生以下奇怪之处:<​​/ p>

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

时间已经过了两个小时,并且时区不再存在了吗?

1 个答案:

答案 0 :(得分:2)

我觉得你误解了约会时间格式。请参阅W3C Date and Time Formats

  
      
  1. 时间以UTC(协调世界时)表示,带有特殊的UTC指示符(“Z”)。
  2.   
  3. 时间以当地时间表示,时间偏差以小时和分钟表示。时区偏移“+ hh:mm”表示日期/时间使用的是本地时区,该时区是UTC的“hh”小时和“mm”分钟。时区偏移量“-hh:mm”表示日期/时间使用的是“hh”小时和“UTC”分钟后面的本地时区。
  4.   

“2014-07-01T20:00:00.000Z”应该等于“2014-07-01 21 :00:00 + 01:00”。因此在本地化日期时出错了,而不是保存到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

如果您需要在当地时间执行日期算术,请再做一步(参见:pytz doc):

local_tz.normalize(local_time)

实际上你可以直接将“.... T .... Z”ISODate保存到Mongo而不转换为当地时间。由于它已包含时区信息,因此无需转换。