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 偏移量是多少的主要内容,如果未能解决你的问题,请参考以下文章
python / pytz问题从本地时区转换为UTC然后返回