2011-05-10 68 views
24

给定特定用户的pytz时区(从他的偏移量计算),我想显示该时区的公用名称。我假设人们更习惯于看到ESTPST而不是像America/NewYork这样拼写出来。如何获取pytz时区的通用名称,例如。 EST/EDT for America/New_York

是否pytz给我这些标准名称的地方,或者我将不得不通过一个表手动做到这一点?这可能会变得混乱,因为例如某个季节的地方是EST,并在其他地方转移到展示EDT。

+5

请注意,通用名称不是唯一的,只有当它完全清楚您所在的国家时才能使用。例如,在澳大利亚也有EST。 – 2011-05-25 09:13:37

+0

@LennartRegebro:即使在同一个国家,[EST可能对应于不同的时区(具有不同的UTC偏移)](http://stackoverflow.com/a/13713813/4279) – jfs 2014-09-13 17:54:20

+0

@LennartRegebro:真的吗?我尝试了解这些事情,所以我很想知道这些例子。你不是指像昆士兰州(总是EST,从来没有EDT)和亚利桑那州(总是USMST(尽管第一个国家的领土),从来没有USMDT),你呢? – 2017-03-14 01:58:19

回答

32

给定特定用户的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' 
>>> 
+0

谢谢。这样可行! – Sidmitra 2011-05-10 07:55:12

+1

如果输入内容日期时间不明确或不存在,例如在DST转换期间,'.localize'可能会返回错误的结果。使用'is_dst = None'来声明输入时间是明确的。 – jfs 2014-03-26 11:18:55

+0

有没有办法从'CDT'回到带'America/Chicago''时区的时区对象? – summerbulb 2016-12-14 11:26:46

4

可以使用tzinfo实例tzname()方法:

>>> tz = timezone('America/St_Johns') 
>>> normal = datetime(2009, 9, 1) 
>>> tz.tzname(normal, is_dst=False) 
'NDT' 
3

如果你正在寻找缩写,然后有几种想到的方法。

第一是:

>>> 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' 
+1

'eastern.localize(datetime.now())'可能会在DST转换期间给你一个错误的结果,请使用'datetime.now(eastern)'代替。 – jfs 2014-08-21 10:40:07

相关问题