如何在Python中获得人类可读的时区名称?

时间:2010-08-15 20:47:55

标签: python timezone

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

如果有一个以上对应于特定时区的人类可读名称,则可能结果列表或其中任何一个都可以,如果没有与当前时区对应的人类可读名称,不管是例外还是None[]或其他什么。

7 个答案:

答案 0 :(得分:9)

http://pytz.sourceforge.net/可能有所帮助。如果没有别的,您可以获取所有时区的列表,然后迭代直到找到与您的偏移相匹配的时区。

答案 1 :(得分:9)

以下内容生成defaultdict映射时区偏移(例如'-0400')和缩写(例如'EDT')到常见的地理时区名称(例如'America / New_York')。

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)。

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

答案 2 :(得分:5)

  

我希望能够获得与系统本地时区相对应的America / New_York形式的“人类可读”时区名称,以显示给用户。

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

要回答标题中的问题(适用于Google的用户),您可以使用%Z%z打印本地时区信息:

#!/usr/bin/env python
import time

print(time.strftime('%Z%z'))
# -> MSK+0300

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

答案 3 :(得分:4)

如果你只想要字面意思,“America / New_York形式的时区名称,对应于系统本地时区”,如果你只关心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对象。我认为你可以用Amber提到的pytz来做到这一点,但对我来说并不是很明显......

答案 4 :(得分:1)

查看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'

答案 5 :(得分:1)

最初写这个问题的时候可能还没有出现,但这是获得时区官方名称的摘录:

>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'

此外,它可以与非原始datetime对象一起使用(也就是使用pytz.<timezone>.localize(<datetime_object>)datetime_object.astimezone(pytz.<timezone>)如下设置实际时区的日期时间:

>>> import datetime, pytz
>>> todaynow = datetime.datetime.now(tz=pytz.timezone('US/Hawaii'))
>>> todaynow.tzinfo # turned into a string, it can be split/parsed
<DstTzInfo 'US/Hawaii' HST-1 day, 14:00:00 STD>
>>> todaynow.strftime("%Z")
'HST'
>>> todaynow.tzinfo.zone
'US/Hawaii'

这当然是为了吸引那些登陆此处的搜索引擎用户。 ...有关更多信息,请访问pytz module site

答案 6 :(得分:0)

#使用tzlocal库

from tzlocal import get_localzone

current_timezone = get_localzone()
zone = current_timezone.zone
print(zone)