在我正在开发的Python项目中,我希望能够获得 America / New_York 形式的“人类可读”时区名称,对应于系统本地时区,向用户显示。我看到的访问时区信息的每一段代码只返回数字偏移量(-0400)或字母代码(EDT),有时两者都返回。是否有一些Python库可以访问这些信息,如果没有,可以将偏移/字母代码转换为人类可读的名称?
如果有一个以上对应于特定时区的人类可读名称,则可能结果列表或其中任何一个都可以,如果没有与当前时区对应的人类可读名称,不管是例外还是None
或[]
或其他什么。
答案 0 :(得分:9)
http://pytz.sourceforge.net/可能有所帮助。如果没有别的,您可以获取所有时区的列表,然后迭代直到找到与您的偏移相匹配的时区。
答案 1 :(得分:9)
以下内容生成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)
请注意,时区缩写可以为vastly different meanings。例如,'EST'可代表澳大利亚的东部夏令时(UTC + 10)或北美的东部标准时间(UTC-5)。
此外,对于使用日光标准时间的区域,偏移和缩写可能会发生变化。因此,保存静态字典可能无法一年365天提供正确的时区名称。
答案 2 :(得分:5)
我希望能够获得与系统本地时区相对应的America / New_York形式的“人类可读”时区名称,以显示给用户。
有tzlocal
module返回与系统本地时区对应的pytz
tzinfo对象:
#!/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偏移量。
答案 3 :(得分:4)
如果你只想要字面意思,“America / New_York形式的时区名称,对应于系统本地时区”,如果你只关心Linux(和类似的),那么这应该做的工作:
import os
import os.path
import sys
def main(argv):
tzname = os.environ.get('TZ')
if tzname:
print tzname
elif os.path.exists('/etc/timezone'):
print file('/etc/timezone').read()
else:
sys.exit(1)
if __name__ == '__main__':
main(sys.argv)
当然,拥有一个以更干净的方式封装它的库会更好,并且可能会处理你在评论中提到的其他情况,例如已经拥有tzinfo
对象。我认为你可以用Amber提到的pytz来做到这一点,但对我来说并不是很明显......
答案 4 :(得分:1)
py> from dateutil.tz import *
py> ny = gettz('America/New York')
py> ny._filename
'/usr/share/zoneinfo/America/New_York'
py> ny._filename.split('/', 4)[-1]
'America/New_York'
答案 5 :(得分:1)
最初写这个问题的时候可能还没有出现,但这是获得时区官方名称的摘录:
>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
此外,它可以与非原始datetime对象一起使用(也就是使用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 module site。
答案 6 :(得分:0)
#使用tzlocal库
from tzlocal import get_localzone
current_timezone = get_localzone()
zone = current_timezone.zone
print(zone)