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

时间:2015-09-02 12:21:49

标签: 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'

偏移量保持不变+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'

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

1 个答案:

答案 0 :(得分:0)

As documented

  

此模块中定义的大多数功能都调用平台C库   具有相同名称的函数。咨询有时可能会有所帮助   平台文档,因为这些函数的语义   各个平台各不相同。

and

  

某些平台可能支持其他指令,但仅限于此   这里列出的那些具有ANSI C标准化的含义   您平台上支持的全套格式代码,请参阅   strftime(3)文档。

...

  

现在不推荐使用%Z,但%z转义扩展为   所有ANSI C库都不支持首选小时/分钟偏移量。

time.strftime()使用C strftime(),因此行为取决于平台。 %z应该适用于POSIX但%z may return the same result as %Z on Windows。 Python {2}中没有记录%z,因此time模块应返回给定平台上返回的任何C strftime()而不做任何更改。

相同的代码在我的机器上的Python 3中工作:

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

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

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

注意:time.strftime('%Z%z')在Python 2和3上都返回'CEST+0200'。差异可能是因为Python< 3.3中缺少tm_zonetm_gmtoff属性。 time.gmtime()time.localtime()都没有提供有关Python 2的时区信息(除了tm_isdst,这就是为什么time.gmtime()会导致CET)。 time.strftime('%Z%z')使用C localtime(),因此即使在Python 2上也可以提供tm_zonetm_gmtoff

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

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