Python 中给定 TimeZone 的标准 UTC 偏移量(无 DST)

Posted

技术标签:

【中文标题】Python 中给定 TimeZone 的标准 UTC 偏移量(无 DST)【英文标题】:Standard UTC offset (Without DST) for a give TimeZone in Python 【发布时间】:2021-02-09 12:08:34 【问题描述】:

我有一个要求,例如,我需要根据标准 UTC 偏移(没有 DST)对多个时区代码进行分组 - 标准 UTC 偏移值在 4 到 6 之间的所有时区将是一组的一部分,所以一个.

如何使用时区代码获取时区的标准 UTC 偏移量?

我尝试了下面的方法,但它给了我 DST 的偏移量。

pytz.timezone('Asia/Jerusalem').localize(datetime.datetime(2011,1,1)).strftime('%z')

【问题讨论】:

什么是“标准 UTC 偏移量”?您知道时区在一年中的不同时间有不同的偏移量吗?您的用例是否意味着您可以获得某个特定时间点的偏移量?或者你想要……没有夏令时? standard UTC offset 是为该特定日期指定的。有些国家总是使用夏令时,有些国家总是使用冬令时,有些国家使用半小时,只是为了与邻国拥有不同的时区。尽管跨越 5 个时区,但中国使用相同的偏移量。 我怀疑您所说的standard UTC offset 是该特定国家/时区的基本偏移量,该国家/地区的法律仍然定义了该偏移量。只有nautical time 完全基于经度 @Panagiotis 如果某个时区总是使用相同的偏移量,那么术语“冬季”和“夏季时间”就没有任何意义。 @deceze 第二个选项,我需要没有 DST 的偏移值。 【参考方案1】:

您可以使用.dst() 方法;它为您提供 DST 的时间增量。如果从.utcoffset() 中减去,您将得到时区的“标准”UTC 偏移量。

from datetime import datetime
from zoneinfo import ZoneInfo

dt_woDST = datetime(2011,1,1, tzinfo=ZoneInfo('Asia/Jerusalem'))
# 2011-01-01 00:00:00+02:00 
dt_DST = datetime(2011,6,1, tzinfo=ZoneInfo('Asia/Jerusalem'))
# 2011-06-01 00:00:00+03:00

utcoff0 = (dt_woDST.utcoffset()-dt_woDST.dst()).total_seconds()
utcoff1 = (dt_DST.utcoffset()-dt_DST.dst()).total_seconds()

print(utcoff0, utcoff0 == utcoff1)
# 7200.0 True

注意:我在这里使用 Python 3.9 的 zoneinfo;当然,这也适用于您使用 pytz 时区对象本地化的日期时间对象。

【讨论】:

以上是关于Python 中给定 TimeZone 的标准 UTC 偏移量(无 DST)的主要内容,如果未能解决你的问题,请参考以下文章

python 使用Django单位中的自定义日期模拟/替换timezone.now()

如何计算红宝石中给定时区与 UTC 的偏移量(以小时为单位)?

Python中的时区转换

python timezone.py

PHP 时区设置date_default_timezone_set(Etc/GMT-8)为啥代表东八区

`datetime.now(pytz timezone)` 啥时候失败?