Python中的时区转换

时间:2013-11-12 14:31:24

标签: python datetime timezone pytz

我可能遗漏了一些关于时区的事情:

>>> import datetime, pytz
>>> date = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date.astimezone(pytz.UTC)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)

我在期待

datetime.datetime(2013, 9, 3, 15, 00, tzinfo=<UTC>)

有人可以解释一下这51分钟的来源吗?

谢谢,

让 - 菲利普

3 个答案:

答案 0 :(得分:6)

UTC偏移给出(date.tzinfo.utcoffset(date)):

datetime.timedelta(0, 540)

这是540秒或9分钟。

在法国,转换到UTC是在1911年3月11日,时钟被转回9分21秒(source 1source 2):

  

到1911年,巴黎距离UTC还有9分21秒。

你也可以在这里看到它(Paris time in 1911),时间从3月11日上午12:01:00到3月10日晚上11:51:39。

答案 1 :(得分:4)

pytz documentation的开头阅读说明;使用.localize()方法创建时区感知日期时间对象:

import datetime
import pytz

naive_dt = datetime.datetime(2013,9,3,16,0)
dt = pytz.timezone("Europe/Paris").localize(naive_dt, is_dst=None)

to_s = lambda d: d.strftime('%Y-%m-%d %H:%M:%S %Z%z')
print(to_s(dt))
print(to_s(dt.astimezone(pytz.utc)))

输出

2013-09-03 16:00:00 CEST+0200
2013-09-03 14:00:00 UTC+0000

我不知道为什么你在这里期待15:00 UTC

答案 2 :(得分:0)

感谢Simeon的回答。这让我意识到我对所有这些的理解有多么浅薄。以下实验让我失去了一点......

>>> import datetime, pytz
>>> date_paris = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date_utc = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.utc)
>>> date_paris.astimezone(pytz.utc)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)
>>> date_utc.astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 18, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)

为什么这个9分钟的偏移在一个方向转换但不在另一个方向转换时显示?下面的代码集中了所有的失望:

>>> date_paris
datetime.datetime(2013, 9, 3, 16, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>)
>>> date_paris.astimezone(pytz.utc).astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 17, 51, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)