6

我对以下行为感到有些困惑。假设我datetime.combine()用来构造一个时区感知对象:

>>> date
datetime.date(2018, 10, 17)
>>> time
datetime.time(6, 0)
>>> tz
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
>>> datetime.combine(date, time, tzinfo=tz)
datetime.datetime(2018, 10, 17, 6, 0, tzinfo=<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>)

或者我pytz.localize()也这样做:

>>> tz.localize(datetime.combine(date, time))
datetime.datetime(2018, 10, 17, 6, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)

请注意tzinfo的时区名称和偏移量如何更改。我无法为该行为找到适当的文档。文件pytz

不幸的是,对于许多时区,使用标准日期时间构造函数的 tzinfo 参数对 pytz “不起作用”。

那么这里到底发生了什么?(有些相关的问题在这里这里。)

4

1 回答 1

7

您刚刚(再次)发现,在创建时区感知日期时间时,您永远不应该直接添加时区信息。始终使用tz.localize().

您看到的问题是因为datetime.combine没有将tzinfo对象调整为实际的日期时间。它仍然假定该时区中第一个有效日期的时区信息,该日期是在 1800 年代后期,并且恰好与0:53:00UTC 不同。

于 2018-10-10T06:38:30.443 回答