Python & pytz:确定时区是不是支持 DST 以及 DST 和非 DST UTC 偏移量是多少

Posted

技术标签:

【中文标题】Python & pytz:确定时区是不是支持 DST 以及 DST 和非 DST UTC 偏移量是多少【英文标题】:Python & pytz: Figure out if a timezone supports DST and what the DST and non-DST UTC offsets arePython & pytz:确定时区是否支持 DST 以及 DST 和非 DST UTC 偏移量是多少 【发布时间】:2012-11-30 08:01:09 【问题描述】:

我正在使用 python 2.7.3 和 pytz。

对于描述某个地区的给定时区(例如 America/New_York),我想知道该时区是否在一年中的部分时间遵守 DST。我关心当前有效的时区定义。换个说法,根据目前的时区定义,这个时区观察者会在接下来的 365 天内(或停止观察)夏令时吗?

另外,我想知道这个时区在观察 DST 时与 UTC 的偏移量是多少,以及当它不观察 DST 时的偏移量是多少。

最后,我想知道给定的时区目前是否正在遵守 DST。

最终目标是生成这样的列表:

Name                    Observes DST     DST Offset     non-DST Offset   Presently DST
--------------------------------------------------------------------------------------
America/New_York        Yes              6              5                No

我不知道如何从 pytz 获取这些信息。

【问题讨论】:

与夏令时无关的 utc 偏移量变化怎么办? 我不知道有这样的事情。您的意思是像不时重新定义时区一样吗?我只对定期的、每年两次的 UTC 偏移量变化感兴趣。是否有任何非 DST 引起的定期、一年两次的偏移变化? 我的意思是由于政治决定而发生的变化。它们是不规则的。 不,我不关心由于政治决定而导致的不规则变化。对于我需要的东西,我只关心将来会发生的变化并且与 DST 严格相关。因此,如果一个时区用于观察 DST 但现在不再这样做,我希望 DST=No. 我创建了一个可行的解决方案。在 7 月创建一个日期,在 12 月创建一个。对于给定的时区,查看两个日期的 UTC 偏移量是否不同。如果是这样,则该时区遵守 DST。我知道偏移量是多少,但不知道七月是否是 DST(想想澳大利亚)。 【参考方案1】:

我可以使用这个函数解决这个问题:

def get_tz_dst_info(tz):
    """
    Gets a 3-tuple of info about DST for a timezone. The returned elements are:
    - a boolean if this timezone observes DST
    - a Decimal UTC offset when not in DST
    - a Decimal UTC offset when in DST

    >>> from pytz import timezone
    >>> get_tz_dst_info(timezone('America/New_York'))
    (True, Decimal('-4'), Decimal('-5'))
    >>> get_tz_dst_info(timezone('Europe/Paris'))
    (True, Decimal('2'), Decimal('1'))
    >>> get_tz_dst_info(timezone('UTC'))
    (False, Decimal('0'), Decimal('0'))
    """
    dec_int_offset = timedelta_utc_offset_to_decimal(
        tz.utcoffset(DECEMBER_DATE)
    )
    jul_int_offset = timedelta_utc_offset_to_decimal(tz.utcoffset(JULY_DATE))
    jul_dst = tz.dst(JULY_DATE)
    dec_dst = tz.dst(DECEMBER_DATE)

    dst_offset = dec_int_offset
    non_dst_offset = jul_int_offset
    if jul_dst >= timedelta(seconds=0):
        dst_offset = jul_int_offset
        non_dst_offset = dec_int_offset
    elif dec_dst >= timedelta(seconds=0):
        dst_offset = jul_int_offset
        non_dst_offset = dec_int_offset
    return (dec_int_offset != jul_int_offset,
            non_dst_offset,
            dst_offset)

【讨论】:

【参考方案2】:

据我所知,没有公共接口。您可以检查 DstTzInfo(及其子类)实例上存在的 _utc_transition_times 属性。

【讨论】:

以上是关于Python & pytz:确定时区是不是支持 DST 以及 DST 和非 DST UTC 偏移量是多少的主要内容,如果未能解决你的问题,请参考以下文章

使用 pytz 从 UTC 偏移“规范”?

python / pytz问题从本地时区转换为UTC然后返回

python 关于时区

python 通过pytz模块进行时区的转换,获取指定时区的时间

python(pytz)中的奇怪时区行为

python不正确的时区转换使用pytz