python time.strftime %z is always zero instead of timezone offset

℡╲_俬逩灬. 提交于 2019-12-12 09:56:25

问题


>>> import time
>>> t=1440935442
>>> time.strftime("%Y/%m/%d-%H:%M:%S %z",time.gmtime(t))
'2015/08/30-11:50:42 +0000'
>>> time.strftime("%Y/%m/%d-%H:%M:%S %z",time.localtime(t))
'2015/08/30-13:50:42 +0000'

The offset stays the same +0000, but I expect '2015/08/30-13:50:42 +0200'

The timezone is correct, as the command is interpreting capital %Z as it should

>>> time.strftime("%Y/%m/%d-%H:%M:%S %Z",time.localtime(t))
'2015/08/30-13:50:42 CEST'

Unix date works like I want

$ date -u --date @1440935442 +"%Y/%m/%d-%H:%M:%S %z"
2015/08/30-11:50:42 +0000
$ date --date @1440935442 +"%Y/%m/%d-%H:%M:%S %z"
2015/08/30-13:50:42 +0200

回答1:


As documented:

Most of the functions defined in this module call platform C library functions with the same name. It may sometimes be helpful to consult the platform documentation, because the semantics of these functions varies among platforms.

and:

Additional directives may be supported on certain platforms, but only the ones listed here have a meaning standardized by ANSI C. To see the full set of format codes supported on your platform, consult the strftime(3) documentation.

...

The use of %Z is now deprecated, but the %z escape that expands to the preferred hour/minute offset is not supported by all ANSI C libraries.

time.strftime() uses C strftime() and therefore the behavior is platform-dependent. %z should work on POSIX but %z may return the same result as %Z on Windows. %z is not documented on Python 2 and therefore time module should return whatever C strftime() returns on the given platform without any changes.

The same code works in Python 3 on my machine:

>>> import time
>>> t = 1440935442
>>> time.strftime("%Z%z", time.gmtime(t))
'GMT+0000'
>>> time.strftime("%Z%z", time.localtime(t)) 
'CEST+0200'

Your issue seems to be Python 2 specific:

>>> import time
>>> t = 1440935442
>>> time.strftime("%Z%z", time.gmtime(t))
'CET+0000'
>>> time.strftime("%Z%z", time.localtime(t))
'CEST+0000'

Note: time.strftime('%Z%z') returns 'CEST+0200' on both Python 2 and 3. The difference might be explained by the absence of tm_zone, tm_gmtoff attributes in Python <3.3. Neither time.gmtime() nor time.localtime() provide timezone info on Python 2 (apart from tm_isdst that is why time.gmtime() leads to CET). time.strftime('%Z%z') uses C localtime() and therefore it may provide tm_zone, tm_gmtoff even on Python 2.

If you need portable behavior and to support timezones that might have different tzname, utc offset in the past; you could use pytz tzinfo objects (e.g., via tzlocal module) that provide access to the historical timezone database:

>>> from datetime import datetime
>>> import tzlocal # $ pip install tzlocal
>>> datetime.fromtimestamp(1440935442, tzlocal.get_localzone()).strftime('%Z%z')
'CEST+0200'


来源:https://stackoverflow.com/questions/32353015/python-time-strftime-z-is-always-zero-instead-of-timezone-offset

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!