使用 pytz
,我知道如何获取 时区名称 列表,但我想获取所有 可能的时区每个时区名称的缩写:
import pytz
list(pytz.common_timezones)
['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa',...]
我正在寻找的是任何时区缩写,例如PST 或PDT,忽略当前日期时间(例如现在),返回所有可能的时区名称,在本例中是一个包含America/Los_Angeles 的列表。
谢谢
最佳答案
既然你想忽略当前的日期时间,听起来你想找
在 任何时间曾使用给定缩写的任何时区
过去。该信息在 Olson 数据库中,可通过
皮茨。但是,pytz 将此信息存储在 private 属性中,
tzone._transition_info
:
import collections
import datetime as DT
import pytz
tzones = collections.defaultdict(set)
abbrevs = collections.defaultdict(set)
for name in pytz.all_timezones:
tzone = pytz.timezone(name)
for utcoffset, dstoffset, tzabbrev in getattr(
tzone, '_transition_info', [[None, None, DT.datetime.now(tzone).tzname()]]):
tzones[tzabbrev].add(name)
abbrevs[name].add(tzabbrev)
gettattr
的第三个(默认)参数是为了处理一些
时区,例如 Africa/Bujumbura
,它从来没有任何转换。所以
这些情况下的缩写是当前缩写。
In [94]: tzones['PST']
Out[94]:
{'America/Bahia_Banderas',
'America/Boise',
'America/Creston',
'America/Dawson',
'America/Dawson_Creek',
'America/Ensenada',
'America/Hermosillo',
'America/Inuvik',
'America/Juneau',
'America/Los_Angeles',
'America/Mazatlan',
'America/Metlakatla',
'America/Santa_Isabel',
'America/Sitka',
'America/Tijuana',
'America/Vancouver',
'America/Whitehorse',
'Canada/Pacific',
'Canada/Yukon',
'Mexico/BajaNorte',
'Mexico/BajaSur',
'PST8PDT',
'Pacific/Pitcairn',
'US/Pacific',
'US/Pacific-New'}
In [95]: tzones['PDT']
Out[95]:
{'America/Boise',
'America/Dawson',
'America/Dawson_Creek',
'America/Ensenada',
'America/Juneau',
'America/Los_Angeles',
'America/Metlakatla',
'America/Santa_Isabel',
'America/Sitka',
'America/Tijuana',
'America/Vancouver',
'America/Whitehorse',
'Canada/Pacific',
'Canada/Yukon',
'Mexico/BajaNorte',
'PST8PDT',
'US/Pacific',
'US/Pacific-New'}
In [97]: abbrevs['America/Los_Angeles']
Out[97]: {'LMT', 'PDT', 'PPT', 'PST', 'PWT'}
作为Paul points out ,请注意时区缩写是不明确的——它们不一定映射到具有相同 utcoffset 的时区。例如,Asia/Shanghai
和 US/Central
都使用 CST
时区缩写。
In [242]: 'Asia/Shanghai' in tzones['CST']
Out[242]: True
In [243]: 'US/Central' in tzones['CST']
Out[243]: True
关于Python:给定时区名称的所有可能时区缩写(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36067621/