【问题标题】:Why datetime.tzinfo instance needs a datetime to get its own attributes?为什么 datetime.tzinfo 实例需要一个 datetime 来获取它自己的属性?
【发布时间】:2018-05-29 10:08:18
【问题描述】:

很长一段时间,我不明白为什么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 是这样设计的?

【问题讨论】:

    标签: python python-datetime


    【解决方案1】:

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

    >>> 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 中看到这一点,但这是例外而不是规则。

    【讨论】:

    • 哦...我不知道。作为一个住在中国的人,时区是如此固定。谢谢你。
    • 这正是时区的用途,以及它们比普通偏移更复杂的原因。
    猜你喜欢
    • 2014-10-22
    • 2019-02-06
    • 2011-12-12
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多