由于您希望忽略当前日期时间,听起来您想查找
在任何时间使用给定缩写的任何时区
过去。该信息位于 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