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

时间:2018-10-10 06:24:24

标签: python datetime timezone

我对以下行为感到困惑。假设我使用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文档说

  

不幸的是,在许多时区中,使用标准datetime构造函数的tzinfo参数对pytz都不起作用。

那么这里到底是怎么回事? (有些相关的问题是herehere。)

1 个答案:

答案 0 :(得分:3)

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

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