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?
list(pytz.country_names)获取country的所有缩写,list(pytz.all_timezones)获取所有时区。
list(pytz.all_timezones)
list(pytz.country_names)
答案 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'])