从UTC偏移获取时区名称

15
如何在Python中根据给定的UTC偏移获取时区名称?
例如,我有以下内容,
"GMT+0530"

我想要得到,
"Asia/Calcutta"

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

4
  1. 你尝试了什么?
  2. 如果它不是一对一映射,会怎样?
- jonrsharpe
可能是重复的问题:如何在Python中获取可读的时区名称? - Fabian Fagerholm
相关:从UTC偏移获取时区缩写。在此答案中使用tz.zone而不是tzname() - jfs
1
请参阅时区标签wiki中的“时区!=偏移量”。 - Matt Johnson-Pint
1个回答

28

一个单一的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

2
God bless you sir - Leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接