Python / Mongoengine - 保存到数据库时缺失时区?
我在用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")
}
为什么时间会比预期少两个小时,而且时区信息也不见了呢?
1 个回答
2
我觉得你可能对日期时间格式有些误解。可以参考一下W3C的日期和时间格式:
- 时间是用协调世界时(UTC)表示的,并且有一个特殊的标识符“Z”。
- 时间也可以用当地时间表示,并且会有一个时区偏移,显示为小时和分钟。比如,"+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文档):
local_tz.normalize(local_time)
其实你可以直接把"....T....Z"格式的ISODate存到Mongo里,而不需要转换为当地时间。因为它已经包含了时区信息,所以不需要再转换。