从 PST -8 0 到其字母名称的时区转换

timezone conversion from PST -8 0 to its alphabetic name

我将时区信息保存为 "PST -8 0"。我想将其转换为等效的时区名称,例如America/Los_Angeles

是否有任何库或 API 可用于此转换?我正在为此任务寻找 BASH 命令或 PYTHON API。

首先我不确定这种转换是否可行,并征求您的意见。

查看 pytz for a Python API to the Olson timezone database

如评论中所述,"PST" 部分可能不可靠。

在某种程度上,使用 pytz 可以暴力破解问题。如果我们假设您想要解析输入的数字部分,并忽略它前面的任何字符串,它可能看起来像这样:

import pytz
import re
from datetime import datetime

def find_timezone_name(input):
    match = re.match(r'.*([+-]\d+) (\d+)', input)
    if match:
        offset = int(match.group(1))+int(match.group(2))/10.0
    else:
        raise ValueError('Unexpected input format')

    refdate = datetime.now()
    for tzname in pytz.common_timezones:
        tzinfo = pytz.timezone(tzname)
        tzoffset = tzinfo.utcoffset(refdate)
        if offset == tzoffset.total_seconds()/3600:
            return tzname
    return "Unknown"

print(find_timezone_name('PST -8 0'))

如果您想将时区限制在特定列表中,您可以将 pytz.common_timezones 替换为其他内容 and/or 如果您有额外的输入数据有助于您的选择过程,请应用其他类型的逻辑.

当然,您可以调整正则表达式以适应其他输入变体。

最后确保您考虑了马特约翰逊在回答同一问题时提到的要点。

虽然在某些特定情况下您可以按要求执行操作,但在一般情况下您不能,原因如下:

  • 时区缩写可能不明确。例如,"CST"有5种不同的含义。见 Wikipedia's list of time zone abbreviations.

  • 时区缩写不统一。维基百科的列表可能与您在其他地方找到的其他缩写词列表不同。在世界上的一些地方,并没有使用缩写词,而另一些地方则争论正确的缩写词应该是什么。

  • 时区偏移量不完全代表时区。太平洋时间不是-8。冬天是-8,夏天是-7。它因夏令时而改变。

  • tzdb中许多不同的时区标识符在某个时间点共享相同的偏移量,有时甚至共享相同的缩写。对于您给出的示例,结果很容易是 America/Vancouver 而不是 America/Los_Angeles。在某些情况下,可以匹配的各个区域对于不同的时间点会有很大的不同。参考 the list of tzdb zones on Wikipedia,其中包括它们的偏移量。