我可能遗漏了一些关于时区的事情:
>>> 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分钟的来源吗?
谢谢,
让 - 菲利普
答案 0 :(得分:6)
UTC偏移给出(date.tzinfo.utcoffset(date)
):
datetime.timedelta(0, 540)
这是540秒或9分钟。
在法国,转换到UTC是在1911年3月11日,时钟被转回9分21秒(source 1,source 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>)