Почему экземпляру datetime.tzinfo требуется datetime, чтобы получить свои собственные атрибуты? - PullRequest
0 голосов
/ 29 мая 2018

В течение длительного времени я не могу понять, почему объекту tzinfo нужно передать внешний datetime для вызова его utcoffset(), tzname() методов, которые выглядят в значительной степени независимыми от внешнего времени.

Например, мне нужно вручную создать бесполезный объект даты-времени, чтобы получить имя часового пояса?

from datetime import datetime
from dateutil.tz import gettz
tz = gettz("UTC")
tz.tzname(datetime.now()) # UTC

Глядя на datetime.py исходный код, реализацию timezone.tzname():

def tzname(self, dt):
    if isinstance(dt, datetime) or dt is None:
        if self._name is None:
            return self._name_from_offset(self._offset)
        return self._name
    raise TypeError("tzname() argument must be a datetime instance"
                    " or None")

Я не вижу, dt используется вообще.

Разве tzinfo не должен знать свое собственное имя, его смещение от UTC?Каким образом свойства часового пояса могут зависеть от внешнего момента времени?Другими словами, почему API разработан таким образом?

1 Ответ

0 голосов
/ 29 мая 2018

Поскольку смещение часового пояса и его имя меняются в разное время года и даже исторически:

>>> 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)

Вы не видите этого с UTC, но это скорее исключение, чем правило.

...