如何在Python中获取可读的时区名称?
在我正在做的一个Python项目中,我想获取一个“人类可读”的时区名称,格式是America/New_York,这个名称对应于系统的本地时区,以便展示给用户。我看到的所有获取时区信息的代码,只返回了数字偏移量(比如-0400)或者字母代码(比如EDT),有时候两者都有。有没有什么Python库可以获取这个信息,或者如果没有的话,能把偏移量/字母代码转换成一个人类可读的名称?
如果一个特定的时区有多个可读的名称,给我一个可能的结果列表或者其中任何一个都可以。如果当前时区没有人类可读的名称,我也可以接受一个异常、None
、[]
或者其他什么。
补充说明:我不太记得我最开始写这个问题时具体想要什么,但我觉得我真正想要的是一种将时区转换为人类可读名称的方法。我认为这个问题并不是专门针对如何获取系统本地时区,但由于我当时想到的具体用例正好是想要本地时区的名称,所以才提到了这个。我没有把关于本地时区的部分从问题中删掉,因为有些回答关注了这两个方面。
9 个回答
我想获取一个“人类可读”的时区名称,比如 America/New_York,这个名称对应系统的本地时区,以便展示给用户。
有一个叫 tzlocal
模块,它可以返回一个 pytz
的时区信息对象(在 tzlocal 3.0
版本之前),这个对象对应于系统的本地时区:
#!/usr/bin/env python
import tzlocal # $ pip install tzlocal
# display "human-readable" name (tzid)
print(tzlocal.get_localzone_name())
# Example Results:
# -> Europe/Moscow
# -> America/Chicago
为了回答标题中的问题(方便谷歌搜索的人),你可以使用 %Z%z
来打印本地时区的信息:
#!/usr/bin/env python
import time
print(time.strftime('%Z%z'))
# Example Results:
# -> MSK+0300
# -> CDT-0500
这会打印出当前时区的缩写和与你的本地时区对应的 UTC 偏移量。
下面的代码会生成一个特殊的字典,这个字典把时区的偏移量(比如 '-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)
for k, v in result.items():
print(k, v)
需要注意的是,时区的缩写可能有很大的不同含义。比如,'EST' 在澳大利亚可能代表东部夏令时(UTC+10),而在北美则代表东部标准时间(UTC-5)。
另外,对于使用夏令时的地区,偏移量和缩写可能会发生变化。所以,如果你保存一个静态的字典,可能在一年中的365天里都不能提供正确的时区名称。
这段内容可能在最初提问时并不存在,但这里有一段代码可以用来获取时区的官方名称:
>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
此外,这段代码可以和一个已经设置了实际时区的日期时间对象一起使用(也就是说,这个日期时间对象是通过 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模块网站。