如何获取pytz时区的通用名称,例如美国/纽约的EST/EDT

48

给定一个用户的pytz时区(根据他的偏移量计算),我想显示该时区的常用名称。 我假设人们更习惯于看到 EST PST 而不是像 America/NewYork 这样拼写出来。

pytz是否在某个地方提供了这些标准名称,还是我必须通过表格手动完成? 这可能会变得混乱,例如有些地方在一个季节中是EST,并在其他季节中转换为显示EDT。


6
请注意,通用名称并非唯一的,只有在清楚地知道所在国家时才应使用。例如,在澳大利亚也有一个名为 EST 的地区。 - Lennart Regebro
@LennartRegebro:即使在同一个国家,EST可能对应不同的时区(具有不同的UTC偏移量) - jfs
@LennartRegebro:真的吗?我试着注意这些事情,所以我很想知道例子。你不是指像昆士兰州(始终为EST,从不是EDT)和亚利桑那州(始终为USMST(首个国家领土除外),从不是USMDT)这样的州吧? - Michael Scheper
我的意思是有几个国家有称为“EST”的时区,因此这些名称实际上并不能告诉您它是哪个时区,除非您也知道是哪个国家。 - Lennart Regebro
4个回答

51

给定一个使用pytz时区库计算出的特定用户的时区,我想显示该时区的通用名称。我假设人们更习惯于看到像EST或PST这样的缩写,而不是像America/NewYork这样拼写出来的。

如果需要从使用pytz本地化的datetime对象中获取此信息...

>>> import pytz as tz
>>> from datetime import datetime as dt
>>> CT = tz.timezone('America/Chicago')
>>>
>>> summer_day = dt(2010, 7, 4, 0, 1, 1)
>>> bar = CT.localize(summer_day, is_dst=None)
>>> bar.tzname()
'CDT'
>>>
>>> christmas = dt(2010, 12, 25, 0, 1, 1)
>>> foo = CT.localize(christmas, is_dst=None)
>>> foo.tzname()
'CST'
>>> 

4
如果输入的本地时间存在歧义或不存在,例如在夏令时转换期间,.localize 可能会返回错误的结果。请使用 is_dst=None 来确认输入时间是无歧义的。 - jfs
6
可以将'CDT'转换为具有'America/Chicago'时区的时区对象吗? - summerbulb
@summerbulb,你应该把你的问题作为一个完全不同的StackOverflow问答来提出。 - Mike Pennington
@summerbulb 你应该将你的问题作为一个完全不同的StackOverflow问答来提出。 - Mike Pennington

8

也许这个问题最初被提出时并没有这个方法,但是这里有一个片段可以获取时区的官方标识:

>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'

此外,这可以与非naive datetime对象一起使用(即已使用pytz.<timezone>.localize(<datetime_object>)datetime_object.astimezone(pytz.<timezone>)设置了实际时区的datetime对象)如下:

>>> 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模块网站了解更多信息。

6
如果您正在寻找缩写,那么有几种方法可以考虑。
首先是:
>>> from pytz import timezone
>>> eastern = timezone('US/Eastern')
>>> eastern._tzname
'EST'

尽管这段代码使用了前置下划线的属性,因此可能被视为私有属性,而且获取数据的最佳位置也许不是这里。另外一个方法是从本地化日期时间对象中获取。
>>> from datetime import datetime
>>> loc_dt = eastern.localize(datetime.now())
>>> loc_dt.strftime('%Z')
'EST'

4
使用datetime.now(eastern)代替eastern.localize(datetime.now()),因为在夏令时转换期间前者可以给出正确的结果。 - jfs

5
你可以使用tzinfo实例的tzname()方法:
>>> tz = timezone('America/St_Johns')
>>> normal = datetime(2009, 9, 1)
>>> tz.tzname(normal, is_dst=False)
'NDT'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接