使用pytz时,Python datetime不包括夏令时信息

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>)
>>>
2个回答

13

sweden对象默认指定了CET时区,但包含足够的信息以知道CEST何时开始和结束。

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

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

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


谢谢提供信息!此外,可以使用pytz.timezone对象的本地化函数来构建本地化日期时间,而不是datetime(...,tzinfo = <tz>)。 - Jesper
4
@Jesper: pytz文档明确指出对于带有DST的时区应该使用.localize()方法而不是使用带有tzinfo参数的datetime构造函数。 - jfs

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接