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

新手上路,请多包涵

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

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


澄清一下:我不记得我最初写这个问题时的确切想法,但我 认为 我真正想要的是一种将时区变成人类可读名称的方法。我不认为这个问题是为了专门关注如何获取系统本地时区,但对于我想到的特定用例,恰好本地时区是我想要的名称。我不会编辑关于当地时区的问题,因为有两个方面的答案。

原文由 David Z 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 451
2 个回答

最初写这个问题时可能还没有,但这里有一个片段来获得时区的官方名称:

 >>> 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 模块站点 查看更多信息。

原文由 ingyhere 发布,翻译遵循 CC BY-SA 4.0 许可协议

以下生成一个 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)

for k, v in result.items():
    print(k, v)

请注意,时区缩写可能具有 截然不同的含义。例如,“EST”可以代表澳大利亚的东部夏令时 (UTC+10) 或北美的东部标准时间 (UTC-5)。

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

原文由 unutbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏