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

Dav*_*d Z 12 python timezone

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

如果有一个以上对应于特定时区的人类可读名称,则可能结果列表或其中任何一个都可以,如果没有与当前时区对应的人类可读名称,我将采取无论是异常或None[]或什么的.

unu*_*tbu 10

以下生成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)
Run Code Online (Sandbox Code Playgroud)

请注意,时区缩写的含义可能大不相同.例如,'EST'可代表澳大利亚的东部夏令时(UTC + 10)或北美的东部标准时间(UTC-5).

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


Amb*_*ber 9

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

  • 迭代不是一个坏主意.我将遍历所有这些并构建一个`shelve`文件,或者只是将一个`dict`存储在一个模块或由字母代码键入的东西中.然后您可以使用应用程序发送`dict`而不必执行两次搜索.在这种情况下你甚至不需要发送`pytz`:你可以在构建`dict'的脚本中使用它 (3认同)

jfs*_*jfs 7

我希望能够获得一个"人类可读"的时区名称,其形式为America/New_York,对应于系统本地时区,以显示给用户.

有一个tzlocal模块返回一个pytz对应于系统本地时区的tzinfo对象:

#!/usr/bin/env python
import tzlocal  # $ pip install tzlocal

print(tzlocal.get_localzone().zone) # display "human-readable" name (tzid)
# -> Europe/Moscow
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/env python
import time

print(time.strftime('%Z%z'))
# -> MSK+0300
Run Code Online (Sandbox Code Playgroud)

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


ing*_*ere 7

最初编写此问题时,这可能还没有出现,但这里有一段用于获取时区官方名称的片段:

>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
Run Code Online (Sandbox Code Playgroud)

此外,这可以与非原始日期时间对象(也称为日期时间,其中实际时区已使用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'
Run Code Online (Sandbox Code Playgroud)

这当然是为了教育那些登陆这里的搜索引擎用户。...在pytz 模块站点上查看更多信息。

  • 我认为提及这一点很有用 - 假设情况确实如此 - 这是 pytz 功能,而不是所有时区对象的固有功能。 (3认同)