2015-09-02 24 views
2
>>> 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'蟒time.strftime%z是总是为零,而不是时区偏移

的时区是正确的,但该命令解释资本%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 
+0

我看到了同样的结果,但要注意在文档中:“使用%Z现在已经过时,而是扩展到%Z逃生所有ANSI C库都不支持首选的小时/分钟偏移量。“ –

+0

(我看不出什么东西可以和strftime做同样的事情,也许你应该看看datetime模块?) –

+0

因为我在一个标准的linux系统上,我期望%z在ansi库中。但它没有按预期工作。这有点难过。我会研究日期时间,但这意味着可能我所有的代码都需要改变。 – Gunstick

回答

0

As documented

本模块中定义的大部分函数调用平台C库 函数名称相同。有关查阅平台文档 有时可能会有帮助,因为这些功能 的语义在不同的平台上有所不同。

and

的其他指令可以支撑在某些平台上,但只有 这里列出的必须由ANSI标准C.意义要查看支持的 全套格式的代码平台,请参阅 strftime(3)文档。

...

使用%Z已经被废弃了,但扩展到 首选小时/分钟偏移不是所有ANSI C库支持的%Z逃生。

time.strftime()使用C strftime(),因此该行为是平台相关的。 %z应该在POSIX上工作,但是在%z may return the same result as %Z on Windows上。 %z没有记录在Python 2中,因此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')回报'CEST+0200'在Python 2和3两。差异可能是由于Python < 3.3中缺少tm_zone,tm_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'