这是一个记录在案的行为:datetime.now() 返回一个幼稚的日期时间对象和%Z returns an empty string in such cases。您需要一个可感知的日期时间对象。
要打印本地时区缩写,您可以使用tzlocal module,它可以将本地时区作为pytz tzinfo 对象返回,该对象可能包含历史时区信息,例如来自the tz database:
#!/usr/bin/env python
from datetime import datetime
import tzlocal # $ pip install tzlocal
now = datetime.now(tzlocal.get_localzone())
print(now.strftime('%Z'))
# -> MSK
print(now.tzname())
# -> MSK
此代码适用于有/没有夏令时的时区。它在 DST 转换期间和期间工作。如果本地时区过去有不同的 utc 偏移量,即使 python 使用的 C 库无法访问给定平台上的历史时区数据库,它也可以工作。
在 Python 3.3+ 中,当平台支持时,您可以使用.tm_zone attribute 来获取 tzname:
>>> import time
>>> time.localtime().tm_zone
'MSK'
或者使用datetime模块:
>>> from datetime import datetime, timezone
>>> datetime.now(timezone.utc).astimezone().tzname()
'MSK'
代码是可移植的,但在某些平台上结果可能不正确(没有.tm_zone(在这种情况下datetime 必须使用time.tzname)和"interesting" timezones)。
在较旧的 Python 版本中,在具有“无趣”时区的系统上,您可以使用 time.tzname:
>>> import time
>>> is_dst = time.daylight and time.localtime().tm_isdst > 0
>>> time.tzname[is_dst]
'MSK'
“有趣”时区的一个例子是 2010-2015 年期间的欧洲/莫斯科时区。
Getting computer's UTC offset in Python 讨论了类似的问题。