使用 pytz 时区时 Python 日期时间不包括 DST

Posted

技术标签:

【中文标题】使用 pytz 时区时 Python 日期时间不包括 DST【英文标题】:Python datetime not including DST when using pytz timezone 【发布时间】:2011-02-09 05:38:59 【问题描述】:

如果我将 UTC 日期时间转换为瑞典格式,则包括夏令时 (CEST)。但是,在创建以瑞典为时区的日期时间时,它会获取 CET 而不是 CEST。这是为什么呢?

>>> # Modified for readability
>>> import pytz
>>> import datetime
>>> sweden = pytz.timezone('Europe/Stockholm')
>>>
>>> datetime.datetime(2010, 4, 20, 16, 20, tzinfo=pytz.utc).astimezone(sweden)
datetime(2010, 4, 20, 18, 20, tzinfo=<... 'Europe/Stockholm' CEST+2:00:00 DST>)
>>> 
>>> datetime.datetime(2010, 4, 20, 18, 20, tzinfo=sweden)
datetime(2010, 4, 20, 18, 20, tzinfo=<... 'Europe/Stockholm' CET+1:00:00 STD>)
>>>

【问题讨论】:

【参考方案1】:

sweden 对象默认指定 CET 时区,但包含足够的信息来了解 CEST 何时开始和停止。

在第一个示例中,您创建了一个datetime 对象并将其转换为本地时间。 sweden 对象知道您传递的 UTC 时间发生在夏令时,并且可以适当地转换它。

在第二个示例中,datetime 构造函数始终将您的输入解释为非夏令时并返回适当的对象。

如果datetime 将您的输入视为挂钟时间并为您选择了适当的夏令时设置,那么在一年中的时间调回时钟时会出现歧义。在挂钟上,同一小时出现两次。因此,datetime 强制您在创建 datetime 对象时指定您使用的时区。

【讨论】:

感谢您的信息!此外,pytz.timezone 对象的 localize 函数可用于构建本地化的日期时间,而不是 datetime(..., tzinfo=) @Jesper:pytz docs 明确表示要使用 .localize() 而不是带有 tzinfo 参数的 datetime 构造函数用于 DST 时区。【参考方案2】:

时区缩写不是唯一的。例如,“IST”可以指“爱尔兰标准时间”、“伊朗标准时间”、“印度标准时间”或“以色列标准时间”。您不应该依赖解析,而应该使用 zoneinfo 时区。

【讨论】:

以上是关于使用 pytz 时区时 Python 日期时间不包括 DST的主要内容,如果未能解决你的问题,请参考以下文章

python 使用`pytz`将时间和日期对话转换为其他时区。

python不正确的时区转换使用pytz

python / pytz问题从本地时区转换为UTC然后返回

使用pytz的python时区转换问题

python - 带有时区的日期时间到纪元

使用 pytz 将日期时间从一个时区转换为另一个时区