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

Posted

技术标签:

【中文标题】如何获取 pytz 时区的通用名称,例如。美国/纽约的 EST/EDT【英文标题】:How to get the common name for a pytz timezone eg. EST/EDT for America/New_York 【发布时间】:2011-08-22 05:39:13 【问题描述】:

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

pytz 是否在某处给了我这些标准名称,还是我必须通过表格手动执行此操作?这可能会变得混乱,因为例如某个季节的地点是美国东部标准时间,而其他地点则转为显示美国东部时间。

【问题讨论】:

请注意,通用名称不是唯一的,只有在完全清楚您所在的国家/地区时才应使用。例如,澳大利亚也有 EST。 @LennartRegebro:即使在同一个国家,EST may correspond to different timezones (with different UTC offsets) @LennartRegebro:真的吗?我试图了解这些事情,所以我很想知道一些例子。您不是指昆士兰州(总是 EST,从不是 EDT)和亚利桑那州(总是 USMST(尽管有第一民族领土),从不是 USMDT),对吗? 我的意思是有几个国家的时区称为“EST”,因此这些名称实际上并不能告诉你它是哪个时区,除非你也知道哪个国家。 【参考方案1】:

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

【讨论】:

.localize 如果输入的原始日期时间不明确或不存在,例如在 DST 转换期间,可能会返回错误结果。使用is_dst=None 断言输入时间是明确的。 有没有办法从'CDT' 回到带有'America/Chicago' 时区的时区对象?【参考方案2】:

你可以使用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'

【讨论】:

eastern.localize(datetime.now()) 在 DST 转换期间可能会给您错误的结果,请改用 datetime.now(eastern)【参考方案4】:

这个问题最初写的时候可能没有,但是这里有一个sn-p来获得时区官方指定:

>>> 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 module site 上查看更多信息。

【讨论】:

以上是关于如何获取 pytz 时区的通用名称,例如。美国/纽约的 EST/EDT的主要内容,如果未能解决你的问题,请参考以下文章

导入 pytz 失败时如何获取太平洋时区的当前时间?

python 通过pytz模块进行时区的转换,获取指定时区的时间

pytz:获取所有时区,现在是特定时间

如何在 Python 中将美国/东部时区转换为美国/中部

pytz:获取所有时区,现在在特定时间范围之间

Python Pytz美国/太平洋时区问题[重复]