Python datetime 在使用 pytz 时不包含夏令时

13 投票
2 回答
7053 浏览
提问于 2025-04-15 21:44

如果我把一个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 个回答

0

时区缩写并不是唯一的。比如“IST”这个缩写可能指的是“爱尔兰标准时间”、“伊朗标准时间”、“印度标准时间”或者“以色列标准时间”。所以你不能仅仅依靠这些缩写来判断时间,最好是使用更准确的时区信息。

13

sweden这个对象默认使用的是中欧时间(CET),但它也有足够的信息来知道夏令时(CEST)什么时候开始和结束。

在第一个例子中,你创建了一个datetime对象,并把它转换为当地时间。sweden对象知道你传入的UTC时间是在夏令时期间,因此可以正确地进行转换。

在第二个例子中,datetime构造函数总是把你的输入当作非夏令时来处理,并返回一个合适的对象。

如果datetime把你的输入当作钟表时间,并为你选择合适的夏令时设置,那么在一年中时钟调回的时候就会出现混淆。在钟表上,同一个小时会出现两次。因此,datetime要求你在创建datetime对象时明确指定你使用的是哪个时区。

撰写回答