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

2024-05-21 06:10:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果有多个人类可读的名称对应于特定时区,可能的结果列表或其中任何一个都可以,如果没有人类可读的名称对应于当前时区,我将采取异常或None[]或其他方式。


Tags: 项目代码用户名称信息new系统格式
3条回答

http://pytz.sourceforge.net/可能有帮助。如果没有其他功能,您可以获取所有时区的列表,然后遍历,直到找到与偏移量匹配的时区。

I'd like to be able to get a "human-readable" timezone name of the form America/New_York, corresponding to the system local timezone, to display to the user.

有一个^{} module返回与系统本地时区对应的pytztzinfo对象:

#!/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偏移量。

下面生成一个defaultdict映射时区偏移量(例如“-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天提供正确的时区名称。

相关问题 更多 >