datetime.combine() 和 pytz.localize() 的区别

Jen*_*ens 5 python timezone datetime

我对以下行为感到有些困惑。假设我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>)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Eri*_*and 6

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

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

  • 谢谢您的回答!为了解释我自己的困惑:“pytz”文档说在创建“datetime.datetime”时避免设置“tzinfo”,但它并没有真正说明不使用“combine()”和本地化的“datetime.time” ` 实例(它根本没有提到 `datetime.time`)。我本可以猜到这样做,虽然我不知道是否建议这样做......看到这个问题和你的答案是有帮助的! (2认同)