2

我在使用 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")
}

是否有任何原因导致时间相差两个小时,并且时区不再存在?

4

1 回答 1

2

我觉得你误解了日期时间格式。请参阅W3C 日期和时间格式

  1. 时间以 UTC(协调世界时)表示,带有一个特殊的 UTC 指示符(“Z”)。
  2. 时间以本地时间以及以小时和分钟为单位的时区偏移量表示。时区偏移量“+hh:mm”表示日期/时间使用比 UTC 早“hh”小时和“mm”分钟的本地时区。“-hh:mm”的时区偏移表示日期/时间使用的是本地时区,比 UTC 晚“hh”小时和“mm”分钟。

“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 中,而无需转换为本地时间。由于它已经包含时区信息,因此无需转换。

于 2014-07-01T04:07:30.567 回答