python time.strftime %z 始终为零而不是时区偏移

Gun*_*ick 6 python timezone strftime

>>> 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'
Run Code Online (Sandbox Code Playgroud)

偏移量保持不变 +0000,但我预计 '2015/08/30-13:50:42 +0200'

时区正确,因为该命令按其应有的方式解释大写 %Z

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

Unix 日期像我想要的那样工作

$ 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
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 4

据记录

该模块中定义的大多数函数都调用同名的平台 C 库函数。有时查阅平台文档可能会有所帮助,因为这些函数的语义因平台而异。

某些平台可能支持其他指令,但只有此处列出的指令具有 ANSI C 标准化的含义。要查看您的平台支持的完整格式代码集,请参阅 strftime(3) 文档。

...

现在已弃用 %Z 的使用,但并非所有 ANSI C 库都支持扩展到首选小时/分钟偏移量的 %z 转义。

time.strftime()使用 C strftime(),因此行为与平台相关。%z应该在 POSIX 上工作,但可能返回与Windows 上%z相同的结果%Z%zPython 2 上没有记录,因此time模块应该返回 Cstrftime()在给定平台上返回的任何内容,而不进行任何更改。

相同的代码在我的机器上的 Python 3 中运行:

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

您的问题似乎是 Python 2 特有的:

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

注意:在 Python 2 和 3 上time.strftime('%Z%z')都会返回'CEST+0200'。差异可能是由于 Python <3.3 中缺少tm_zone,tm_gmtoff属性造成的。既不提供 Python 2 上的时time.gmtime()time.localtime()信息(除此之外,这就是导致 的tm_isdst原因)。使用 C ,因此它可能提供,即使在 Python 2 上也是如此。time.gmtime()CETtime.strftime('%Z%z')localtime()tm_zonetm_gmtoff

如果您需要可移植的行为并支持过去可能具有不同 tzname、utc 偏移量的时区;您可以使用pytztzinfo 对象(例如,通过tzlocal模块)来提供对历史时区数据库的访问:

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