Python:从strftime中打印时区



我想打印时区。我使用%Z,但它不打印:

import datetime
now = datetime.datetime.now()
print now.strftime("%d-%m-%Y")
print now.strftime("%d-%b-%Y")
print now.strftime("%a,%d-%b-%Y %I:%M:%S %Z") # %Z doesn't work

我可能需要导入pytz吗?

对我来说最简单的:

$ python3
>>> import datetime
>>> datetime.datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S %z")
>>> datetime.datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S %Z")
>>> exit()

这是一个有记录的行为:datetime.now()返回一个朴素的日期时间对象,%Z在这种情况下返回一个空字符串。你需要一个可感知的datetime对象。

要打印本地时区缩写,您可以使用tzlocal模块,它可以将您的本地时区作为pytz tzinfo对象返回,该对象可能包含历史时区信息,例如,来自tz数据库:

#!/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属性来获得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)和"有趣的"时区)。

在较旧的Python版本上,在具有"无趣"时区的系统上,您可以使用time.tzname:

>>> import time
>>> is_dst = time.daylight and time.localtime().tm_isdst > 0
>>> time.tzname[is_dst]
'MSK'

一个"有趣的"时区的例子是2010-2015年期间的欧洲/莫斯科时区。

在Python中获取计算机的UTC偏移量中讨论了类似的问题。

now()返回类datetime.datetime的对象,该对象本身不包含有关其时区的信息。(即它是"幼稚的";参见"naive"vs的描述。文档中的"aware"日期和时间对象)

根据文档,

现在

datetime.datetime。 ( tz =没有)

返回当前本地日期和时间。

如果可选参数tzNone或未指定,则将时间戳转换为平台的本地日期和时间,返回的datetime对象为朴素型。

要获取平台的本地时区,应该使用pytz,正如您建议的那样。下面是Alex Martelli的代码:

>>> import datetime
>>> now = datetime.datetime.now()
>>>
>>> from pytz import reference
>>> localtime = reference.LocalTimezone()
>>> localtime.tzname(now)
'Mountain Daylight Time'

您还可以通过以下方式获得实际的UTC偏移量,以小时为单位:

>>> import time
>>> print(-time.timezone / 3600) # convert from seconds to hours
-7.0

所以你可以使用:

>>> print(now.strftime("%a, %d-%b-%Y %I:%M:%S, " + localtime.tzname(now)))
Wed, 08-Jul-2015 01:27:49, Mountain Daylight Time

不应该使用pytz。从帮助:

名称
pytz.reference


描述参考Python文档中的tzinfo实现。
用于测试,因为它们只适用于年份
1987年到2006年。不要将它们用于实际代码。

最新更新