Python:从strftime打印时区

时间:2015-07-08 17:27:01

标签: python date time

我想打印时区。我使用%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

4 个答案:

答案 0 :(得分:11)

对我来说最简单:

$ 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()

答案 1 :(得分:6)

now()返回类datetime.datetime的对象,该对象本身并不包含有关其时区的信息。 (即它是“天真的”;参见“天真”与“知晓”日期和时间对象的描述in the documentation

根据documentation

  

datetime.datetime。的现在 TZ =无

     

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

     

...

     

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

要获得平台的本地时区,您应该按照建议使用pytzHere's Alex Martelli's code to do this

>>> 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

答案 2 :(得分:5)

这是一种记录在案的行为:datetime.now()返回一个天真的日期时间对象和%Z returns an empty string in such cases。您需要一个有意识的日期时间对象。

要打印本地时区缩写,您可以使用tzlocal module作为pytz tzinfo对象返回本地时区,该对象可能包含来自the tz database的历史时区信息:< / p>

#!/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_zonedatetime在这种情况下必须使用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中讨论了类似的问题。

答案 3 :(得分:0)

pytz不应使用。从帮助中:

  

NAME
      pytz.reference

     

DESCRIPTION
     请参考Python文档中的tzinfo实现。
     用于测试,因为它们仅适用于多年
     1987年至2006年。请勿将其用于真实代码。