2015-12-16 42 views
1

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

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

我不确定此转换是否可能首先可能,并寻求您的意见。

+0

好的。这意味着它们中的一些可以被转换,对吗?在那种情况下,使用哪些API来转换它们? – AnilJ

+0

您想要“解析”哪部分输入,是“PST”部分还是“-8 0”部分? – Sebastian

+0

PST。我不知道如何影响它。其实我有两种形式。 1. PST8:0和2. PST 8 0。 – AnilJ

回答

2

检出pytz为Python的API到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特定列表与别的东西和/或应用其他类型的逻辑,如果你有额外的输入数据,这将有助于你的选择过程。

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

最后确保您考虑到Matt Johnson在回答这个问题时提到的几点。

+2

很好的尝试,但是这与* current * offset严格匹配,因为时区可以改变偏移量可以为DST(和其他原因),你会得到不同的结果,取决于*当你运行这个代码时,请参阅[时区标记wiki]中的“时区!=偏移量”(http://stackoverflow.com/tags/)时区/信息) –

+0

@MattJohnson我同意,我没有时间深入研究“陷阱”,但你的回答很好地覆盖了它们,最后它与具体要求密切相关。应该说明如何处理这些案例/场景/考虑因素,然后实施可以相应改变。但是我确实认为示例代码应该提供一个很好的起点。 – Sebastian

4

虽然可能有一些特定的情况下,你可以做你的要求,在一般如果你不能,有以下几个原因:

  • 时区缩写可以是不明确的。例如,"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,其中包含它们的偏移量。