如何在Python中获取可读的时区名称?

30 投票
9 回答
31590 浏览
提问于 2025-04-16 02:50

在我正在做的一个Python项目中,我想获取一个“人类可读”的时区名称,格式是America/New_York,这个名称对应于系统的本地时区,以便展示给用户。我看到的所有获取时区信息的代码,只返回了数字偏移量(比如-0400)或者字母代码(比如EDT),有时候两者都有。有没有什么Python库可以获取这个信息,或者如果没有的话,能把偏移量/字母代码转换成一个人类可读的名称?

如果一个特定的时区有多个可读的名称,给我一个可能的结果列表或者其中任何一个都可以。如果当前时区没有人类可读的名称,我也可以接受一个异常、None[]或者其他什么。


补充说明:我不太记得我最开始写这个问题时具体想要什么,但我觉得我真正想要的是一种将时区转换为人类可读名称的方法。我认为这个问题并不是专门针对如何获取系统本地时区,但由于我当时想到的具体用例正好是想要本地时区的名称,所以才提到了这个。我没有把关于本地时区的部分从问题中删掉,因为有些回答关注了这两个方面。

9 个回答

14

我想获取一个“人类可读”的时区名称,比如 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 偏移量。

17

下面的代码会生成一个特殊的字典,这个字典把时区的偏移量(比如 '-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天里都不能提供正确的时区名称。

8

这段内容可能在最初提问时并不存在,但这里有一段代码可以用来获取时区的官方名称:

>>> 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模块网站

撰写回答