Python:给定时区名称的所有可能时区缩写(反之亦然)

标签 python datetime timezone pytz

使用 pytz,我知道如何获取 时区名称 列表,但我想获取所有 可能的时区每个时区名称的缩写:

import pytz
list(pytz.common_timezones)
['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa',...]

我正在寻找的是任何时区缩写,例如PSTPDT,忽略当前日期时间(例如现在),返回所有可能的时区名称,在本例中是一个包含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/ShanghaiUS/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/

相关文章:

php - 为什么 DateTime::diff 在这些日期之间返回 0 天?

python - 无法在 Python 的 open() 中传递包含当前日期和时间的字符串

sql - 选择由大范围约束的一组小范围内发生的所有时间(小时/分钟) - SQL 2000

javascript - 如何在 Javascript 中将 UTC/GMT 日期时间转换为 CST? (不是本地的,CST 总是)

git - 更改 git 历史记录中所有提交的时区

python - win32.Dispatch 与 Python 中的 win32.gencache。优缺点都有什么?

Python 数据操作 : How to group by ID, 然后子集行向前/向后 1 个月基于每个组中的日期时间条件?

python - matplotlib 中图像中的标签问题

Python - 属性错误 : 'module' object has no attribute 'QueryFrame'

php - 我如何使用 php 操作 MySQL Datetime(添加小时数并转换为时区)?