10

我可能遗漏了一些关于时区的信息:

>>> 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 分钟是从哪里来的?

谢谢,

让-菲利普

4

3 回答 3

11

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

datetime.timedelta(0, 540)

这是 540 秒或 9 分钟。

在法国,1911 年 3 月 11 日切换到 UTC,时钟拨回 9 分 21 秒(来源 1来源 2):

直到 1911 年,巴黎比世界标准时间差 9 分 21 秒。

您也可以在这里看到它(1911 年的巴黎时间),时间从 3 月 11 日凌晨 12:01:00 到 3 月 10 日晚上 11:51:39。

于 2013-11-12T14:39:36.223 回答
6

pytz阅读文档开头的注释;使用.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这里。

于 2013-11-13T22:26:17.257 回答
4

感谢西蒙的回答。这让我意识到我对这一切的理解是多么肤浅。以下实验让我失去了更多......

>>> 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>) 
于 2013-11-12T15:37:58.817 回答