从 UTC 偏移量获取时区名称

Posted

技术标签:

【中文标题】从 UTC 偏移量获取时区名称【英文标题】:Getting timezone name from UTC offset 【发布时间】:2016-05-07 05:36:22 【问题描述】:

如何从 Python 中的给定 UTC 偏移量获取时区名称?

例如,我有,

"GMT+0530"

我想得到,

"Asia/Calcutta"

如果有多个匹配项,结果应该是时区名称列表。

【问题讨论】:

1.你试过什么? 2. 如果不是一对一映射怎么办? How can I get a human-readable timezone name in Python?的可能重复 相关:Get timezone abbreviation from UTC offset。在this answer 中使用tz.zone 而不是tzname() 另见timezone tag wiki中的“时区!=偏移”。 【参考方案1】:

可能有 零个或多个(多个)时区对应于一个单个 UTC 偏移。现在要查找这些具有给定 UTC 偏移量的时区:

#!/usr/bin/env python
from datetime import datetime, timedelta
import pytz  # $ pip install pytz

utc_offset = timedelta(hours=5, minutes=30)  # +5:30
now = datetime.now(pytz.utc)  # current time
print(tz.zone for tz in map(pytz.timezone, pytz.all_timezones_set)
       if now.astimezone(tz).utcoffset() == utc_offset)

输出

set(['Asia/Colombo', 'Asia/Calcutta', 'Asia/Kolkata'])

如果您想考虑历史数据(根据当前时区规则,在某个日期具有/将具有给定 UTC 偏移量的时区):

#!/usr/bin/env python
from datetime import datetime, timedelta
import pytz  # $ pip install pytz

utc_offset = timedelta(hours=5, minutes=30)  # +5:30
names = set()
now = datetime.now(pytz.utc)
for tz in map(pytz.timezone, pytz.all_timezones_set):
    dt = now.astimezone(tz)
    tzinfos = getattr(tz, '_tzinfos',
                      [(dt.utcoffset(), dt.dst(), dt.tzname())])
    if any(off == utc_offset for off, _, _ in tzinfos):
        names.add(tz.zone)
print("\n".join(sorted(names)))

输出

Asia/Calcutta
Asia/Colombo
Asia/Dacca
Asia/Dhaka
Asia/Karachi
Asia/Kathmandu
Asia/Katmandu
Asia/Kolkata
Asia/Thimbu
Asia/Thimphu

【讨论】:

上帝保佑你先生

以上是关于从 UTC 偏移量获取时区名称的主要内容,如果未能解决你的问题,请参考以下文章

.NET 通过时区名称获取时区偏移量

如何使用 pytz 从时区字符串中获取 UTC 偏移量?

Python - 给定时间戳UTC和UTC偏移量的时区名称

给定 UTC 时间戳和 UTC 偏移量,是不是可以在 Python 中获取时区?

获取节点中特定时区的 UTC 偏移量和 DST 信息? [复制]

pytz 时区的 STD 偏移量