13

如果我将 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>)
>>>
4

2 回答 2

13

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

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

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

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

于 2010-04-17T20:46:47.060 回答
0

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

于 2010-11-09T14:56:11.850 回答