Python 为什么datetime.tzinfo实例需要一个datetime来获取自己的属性?

Python 为什么datetime.tzinfo实例需要一个datetime来获取自己的属性?,python,python-datetime,Python,Python Datetime,很长一段时间以来,我无法理解为什么一个tzinfo对象需要传递一个外部datetime来调用它的utcoffset(),tzname()方法,这些方法看起来与外部时间非常独立 例如,我必须手动构造一个无用的datetime对象来获取时区的名称 from datetime import datetime from dateutil.tz import gettz tz = gettz("UTC") tz.tzname(datetime.now()) # UTC 查看datetime.py源代码,

很长一段时间以来,我无法理解为什么一个
tzinfo
对象需要传递一个外部
datetime
来调用它的
utcoffset()
tzname()
方法,这些方法看起来与外部时间非常独立

例如,我必须手动构造一个无用的datetime对象来获取时区的名称

from datetime import datetime
from dateutil.tz import gettz
tz = gettz("UTC")
tz.tzname(datetime.now()) # UTC
查看
datetime.py
源代码,
timezone.tzname()
的实现:

我看根本没有使用
dt


tzinfo
不应该知道它自己的名字,它与UTC的偏移量吗?时区的属性以何种方式依赖于外部时间点?换句话说,为什么API是这样设计的?

因为时区的偏移量和名称在一年中的不同时间发生变化,甚至在历史上也会发生变化:

>>> tz
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
>>> tz.tzname(datetime.now())
'CEST'
>>> tz.tzname(datetime(2018, 1, 1))
'CET'
>>> tz.tzname(datetime(1900, 1, 1))
'LMT'
>>> tz.utcoffset(datetime.now())
datetime.timedelta(0, 7200)
>>> tz.utcoffset(datetime(2018, 1, 1))
datetime.timedelta(0, 3600)
>>tz
>>>tzname(datetime.now())
“塞斯特”
>>>tz.tzname(日期时间(2018年1月1日))
“CET”
>>>tzname(日期时间(1900,1,1))
“LMT”
>>>utcoffset(datetime.now())
datetime.timedelta(07200)
>>>tz.utcoffset(日期时间(2018年1月1日))
datetime.timedelta(03600)

在UTC中,您看不到这一点,但这只是一个例外,而不是规则。

哦。。。我不知道。作为一个生活在时区如此固定的中国的人。谢谢。这正是时区的用途,也是为什么它们比普通的偏移量更复杂的原因。
>>> tz
<DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
>>> tz.tzname(datetime.now())
'CEST'
>>> tz.tzname(datetime(2018, 1, 1))
'CET'
>>> tz.tzname(datetime(1900, 1, 1))
'LMT'
>>> tz.utcoffset(datetime.now())
datetime.timedelta(0, 7200)
>>> tz.utcoffset(datetime(2018, 1, 1))
datetime.timedelta(0, 3600)