代码之家  ›  专栏  ›  技术社区  ›  David Z

如何在python中获取人类可读的时区名称?

  •  10
  • David Z  · 技术社区  · 15 年前

    在我正在研究的Python项目中,我希望能够获得表单的“可读”时区名称。 美洲/纽约 对应于系统本地时区,以显示给用户。我看到的访问时区信息的每一段代码都只返回数字偏移量(-0400)或字母代码(EDT),有时两者都返回。是否有一些python库可以访问这些信息,或者如果没有,将偏移量/字母代码转换为人类可读的名称?

    如果一个特定时区对应多个人类可读的名称,则可能的结果列表或其中任何一个都可以,如果当前时区对应的人类可读名称不存在,则我将接受一个例外或 None [] 或者什么。

    5 回复  |  直到 9 年前
        1
  •  9
  •   Amber    15 年前

    http://pytz.sourceforge.net/ 可能会有所帮助。如果没有其他内容,您可能能够获取所有时区的列表,然后迭代,直到找到与偏移量匹配的时区。

        2
  •  9
  •   unutbu    15 年前

    下面将生成一个默认的dict映射时区偏移量(例如“-0400”)和缩写词(例如“edt”)到通用地理时区名称(例如“美国/纽约”)。

    import os
    import dateutil.tz as dtz
    import pytz
    import datetime as dt
    import collections
    
    result=collections.defaultdict(list)
    for name in pytz.common_timezones:
        timezone=dtz.gettz(name)
        now=dt.datetime.now(timezone)
        offset=now.strftime('%z')
        abbrev=now.strftime('%Z')
        result[offset].append(name)
        result[abbrev].append(name)    
    print(result)
    

    注意时区缩写可以有 vastly different meanings . 例如,“est”可以代表澳大利亚的东部夏季(UTC+10),也可以代表北美的东部标准时间(UTC-5)。

    此外,对于使用日光标准时间的区域,偏移和缩写可能会更改。因此,保存静态dict可能无法提供一年365天的正确时区名称。

        3
  •  5
  •   jfs    9 年前

    我希望能够得到一个“人类可读”的时区名称,格式为美国/纽约,对应于系统本地时区,以显示给用户。

    tzlocal module 返回一个 pytz 与系统本地时区对应的TZINFO对象:

    #!/usr/bin/env python
    import tzlocal  # $ pip install tzlocal
    
    print(tzlocal.get_localzone().zone) # display "human-readable" name (tzid)
    # -> Europe/Moscow
    

    要回答标题中的问题(对于来自谷歌的人),您可以使用 %Z%z 要打印本地时区信息:

    #!/usr/bin/env python
    import time
    
    print(time.strftime('%Z%z'))
    # -> MSK+0300
    

    它打印当前时区缩写和与本地时区对应的UTC偏移量。

        4
  •  4
  •   poolie    13 年前

    如果您只想按照字面上的要求,“美国/纽约形式的时区名称,对应于系统本地时区”,并且如果您只关心Linux(和类似的),那么应该这样做:

    import os
    import os.path
    import sys 
    
    def main(argv):
      tzname = os.environ.get('TZ')
      if tzname:
        print tzname
      elif os.path.exists('/etc/timezone'):
        print file('/etc/timezone').read()
      else:
        sys.exit(1)
    
    if __name__ == '__main__':
      main(sys.argv)
    

    当然,如果有一个以更干净的方式封装此内容的库,并且它可以处理您在评论中提到的其他情况,比如已经有了一个 tzinfo 对象。我想你可以用 pytz Amber提到过,但我并不清楚…

        5
  •  1
  •   Jesse Dhillon    15 年前

    退房 python-dateutil

    py> from dateutil.tz import *
    py> ny = gettz('America/New York')
    py> ny._filename
    '/usr/share/zoneinfo/America/New_York'
    py> ny._filename.split('/', 4)[-1]
    'America/New_York'