python time.strftime% z siempre es cero en lugar del desplazamiento de zona horaria

>>> 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' 

La compensación se mantiene igual +0000, pero espero ‘2015/08 / 30-13: 50: 42 +0200’

La zona horaria es correcta, ya que el comando está interpretando el capital% Z como debería

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

La fecha de Unix funciona como yo quiero

 $ 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 

Según lo documentado :

La mayoría de las funciones definidas en este módulo llaman a la plataforma C las funciones de biblioteca con el mismo nombre. A veces puede ser útil consultar la documentación de la plataforma, ya que la semántica de estas funciones varía según las plataformas.

y :

Se pueden admitir directivas adicionales en ciertas plataformas, pero solo las que se enumeran aquí tienen un significado estandarizado por ANSI C. Para ver el conjunto completo de códigos de formato admitidos en su plataforma, consulte la documentación de strftime (3).

El uso de% Z ahora está en desuso, pero todas las bibliotecas ANSI C no admiten el escape% z que se expande a la compensación de hora / minuto preferida.

time.strftime() usa C strftime() y, por lo tanto, el comportamiento depende de la plataforma. %z debería funcionar en POSIX pero %z puede devolver el mismo resultado que %Z en Windows . %z no está documentado en Python 2 y, por lo tanto, el módulo de time debe devolver cualquier cosa que C strftime() devuelva en la plataforma dada sin ningún cambio.

El mismo código funciona en Python 3 en mi máquina:

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

Su problema parece ser específico de Python 2:

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

Nota: time.strftime('%Z%z') devuelve 'CEST+0200' en Python 2 y 3. La diferencia puede explicarse por la ausencia de los tm_zone , tm_gmtoff en Python <3.3. Ni time.gmtime() ni time.localtime() proporcionan información de zona horaria en Python 2 (aparte de tm_isdst por eso time.gmtime() lleva a CET ). time.strftime('%Z%z') usa C localtime() y, por lo tanto, puede proporcionar tm_zone , tm_gmtoff incluso en Python 2.

Si necesita un comportamiento portátil y para admitir zonas horarias que puedan tener un nombre tz diferente, utilice la compensación en el pasado; puede usar objetos pytz tzinfo (por ejemplo, a través del módulo tzlocal ) que proporcionan acceso a la base de datos histórica de zona horaria:

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