为什么pytz的localize()不返回与其匹配的tzinfo的datetime对象?

13 投票
1 回答
4369 浏览
提问于 2025-04-18 10:44

有没有人能帮我理解这里发生了什么?

import pytz
from datetime import datetime
tz = pytz.timezone('Europe/Berlin')
print repr(tz)
# <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
dt = datetime(2011, 1, 3, 18, 40)
result = tz.localize(dt)
print repr(result.tzinfo)
# <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>
assert result.tzinfo == tz, "Why aren't these the same timezone?"

我原本以为,pytz库中的时区对象的localize()方法会把一个没有时区信息的日期时间对象(也就是“天真”的日期时间)加上一个和时区对象匹配的tzinfo属性,这样就能正确表示这个日期时间在特定时区的时间。但在这个情况下,这似乎没有发生。

显然,我对时区或者pytz处理时区的方式有些误解。有没有人能解释一下?

1 个回答

14

它们处于同一个时区 - "Europe/Berlin"

当你打印这些时间时,输出结果会包含当时的缩写和时间偏移量。

如果你查看一下时区数据源,你会发现:

# Zone  NAME            GMTOFF   RULES       FORMAT   [UNTIL]
Zone    Europe/Berlin   0:53:28  -           LMT      1893 Apr
                        1:00     C-Eur       CE%sT    1945 May 24 2:00
                        1:00     SovietZone  CE%sT    1946
                        1:00     Germany     CE%sT    1980
                        1:00     EU          CE%sT

所以看起来,当时区没有对某个日期时间进行本地化处理时,它就会使用第一个条目。

另外,pytz似乎没有保留原始地方平均时间偏差的额外28秒 - 不过这没关系,除非你在处理1893年4月之前的柏林日期。

撰写回答