获取LMT信息和pytz中的所有缩写tz

时间:2014-08-17 13:06:19

标签: python timezone pytz

import pytz,datetime
tz1 = pytz.timezone('Asia/Shanghai')
tz1
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
>>> str(tz1)
'Asia/Shanghai'

1.我可以从tz1的输出中得到LMT+8:06:00的字符串吗?

fmt = '%Y-%m-%d %H:%M:%S %Z%z'
dt1 = tz1.localize(datetime.datetime(2002, 10, 27, 6, 0, 0))
print(dt1.strftime(fmt))
2002-10-27 06:00:00 CST+0800

2.我可以得到时区的所有缩写,由2002-10-27 06:00:00 CST+0800?

中的3个上位字符组成,如CST

list(pytz.country_names)获取country的所有缩写,list(pytz.all_timezones)获取所有时区。

list(pytz.all_timezones)
list(pytz.country_names)

1 个答案:

答案 0 :(得分:1)

  

1.我可以从tz1的输出中得到LMT + 8:06:00的字符串吗?

单个pytz.timezone('Asia/Shanghai')对象可能对应于多个不同的tzinfo个对象(不同的tzname()dst()和/或utcoffset())。 tz1的默认表示显示了其中一个对象。您需要具体日期才能获得正确的tzinfo:

>>> from datetime import datetime
>>> import pytz
>>> tz = pytz.timezone('Asia/Shanghai')
>>> tz
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'
>>> tz.localize(datetime(2002, 10, 27, 6, 0, 0), is_dst=None).strftime(fmt)
'2002-10-27 06:00:00 CST+0800'
>>> tz.localize(datetime(1902, 10, 27, 6, 0, 0), is_dst=None).strftime(fmt)
'1902-10-27 06:00:00 LMT+0806'

,即亚洲/上海在1902年的抵消额为+0806。


  

2.如何在2002-10-27 06:00:00 CST + 0800获得时区的所有缩写,由CST等3个上位字符组成?

如果你有一个知道的日期时间对象,那么只需调用它的.tzname()方法或明确地将日期传递给时区:

>>> tz.tzname(datetime(2002, 10, 27, 6, 0, 0), is_dst=None)
'CST'

没有公共API可以枚举给定zoneinfo时区的所有可能tzname()值。您可以使用DstTzInfo._transition_info属性来获取值(没有远期未来的值(出于显而易见的原因)):

>>> datetime.now(tz).tzname()
'CST'
>>> {tzname for _, _, tzname in getattr(tz, '_transition_info', [])}
set(['CDT', 'CST', 'LMT'])