在pytz中获取LMT信息和所有时区缩写

1 投票
1 回答
890 浏览
提问于 2025-04-18 17:34
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 中的CST?

使用list(pytz.country_names)可以获取所有国家的缩写,使用list(pytz.all_timezones)可以获取所有时区。

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

1 个回答

2

1. 我怎么才能从 tz1 的输出中得到 LMT+8:06:00 这个字符串呢?

一个 pytz.timezone('Asia/Shanghai') 对象可能对应多个不同的 tzinfo 对象(比如不同的 tzname()dst() 和/或 utcoffset())。默认情况下,tz1 显示的就是其中一个这样的对象。要获取正确的时区信息,你需要一个具体的日期:

>>> 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 年时,Asia/Shanghai 的 UTC 偏移是 +0806。


2. 我怎么才能得到所有由三个大写字母组成的时区缩写,比如在 2002-10-27 06:00:00 CST+0800 中的 CST?

如果你有一个带时区的日期时间对象,只需调用它的 .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'])

撰写回答