为什么pytz localize()不会生成一个日期时间对象,其tzinfo与本地化的tz对象匹配?

bjm*_*jmc 11 python timezone datetime pytz tzinfo

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

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?"
Run Code Online (Sandbox Code Playgroud)

我的理解是localize()pytz时区对象上的方法将采用一个天真的日期时间对象,并添加一个tzinfo匹配执行本地化的时区对象的属性.在这种情况下似乎没有发生这种情况.

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

Mat*_*int 10

他们同一时区 - "Europe/Berlin".

打印时,输出包括在该特定时间点应用的缩写和偏移量.

如果您检查tz数据源,您将看到:

# 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
Run Code Online (Sandbox Code Playgroud)

因此,当时区未定位日期时间时,它似乎只使用第一个条目.

似乎pytz不会保留原始当地平均时间偏差的额外28秒 - 但这并不重要,除非您在1893年4月之前在柏林处理日期.

  • 通常,在没有特定日期和时间的情况下,我不会认为tzinfo与其他tzinfo具有可比性。但是,如果您知道两个对象都来自pytz(或[tzlocal](https://pypi.python.org/pypi/tzlocal)),则可以比较它们的`.zone`属性,该属性只包含字符串区域标识符(“欧洲/柏林”)。 (2认同)
  • @PeterBengtsson - 那么不要使用替换,使用“localize”。问题是要求理解“为什么”会发生,所以这就是这个答案的措辞。 (2认同)