我有一个时区信息保存为"PST -8 0"
。我想将其转换为等效的时区名称,例如America/Los_Angeles
。
是否有任何库或API可用于此转换?我正在为这个任务寻找BASH命令或PYTHON API。
首先,我不确定这种转换是否可能,请您对此发表评论。
虽然在某些特定情况下,您可以按照自己的要求执行操作,但在一般情况下,由于以下几个原因,您无法执行操作:
-
时区缩写可能不明确。例如,
"CST"
有5种不同的含义。请参阅维基百科的时区缩写列表。 -
时区缩写不统一、不一致。维基百科的列表可能会与其他地方的缩写列表有所不同。在世界上的一些地方,没有使用缩写,而其他地方则在争论正确的缩写应该是什么
-
时区偏移量并不完全表示时区。太平洋时间不是-8。冬天是-8,夏天是-7。它在夏令时时更改。
-
tzdb中的许多不同时区标识符在某个时间点共享相同的偏移量,有时甚至共享相同的缩写。对于您给出的示例,结果可以很容易地为
America/Vancouver
而不是America/Los_Angeles
。在某些情况下,对于不同的时间点,可以匹配的各个区域将显著不同。请参阅维基百科上的tzdb区域列表,其中包括它们的偏移量。
检查pytz以获取Olson时区数据库的Python API。
正如评论中提到的,"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
,和/或如果您有其他有助于选择过程的输入数据,则可以应用其他类型的逻辑。
当然,您可以调整正则表达式以适应其他输入变体。
最后,确保你考虑到马特·约翰逊在回答同一问题时提到的要点。