从 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,其中包括它们的偏移量。
我将时区信息保存为 "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,其中包括它们的偏移量。