如何获取 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 时区(从他的偏移量计算),我想显示该时区的通用名称。我假设人们更习惯于看到 EST 或 PST,而不是像 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的主要内容,如果未能解决你的问题,请参考以下文章