>>> 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
As documented:
Most of the functions defined in this module call platform C libraryfunctions with the same name. It may sometimes be helpful to consultthe platform documentation, because the semantics of these functionsvaries among platforms.
and:
Additional directives may be supported on certain platforms, but onlythe ones listed here have a meaning standardized by ANSI C. To see thefull set of format codes supported on your platform, consult thestrftime(3) documentation.
...
The use of %Z is now deprecated, but the %z escape that expands to thepreferred 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'