¿Cómo puedo obtener un nombre de zona horaria legible por humanos en Python?

En un proyecto de Python en el que estoy trabajando, me gustaría poder obtener un nombre de zona horaria “legible por humanos” del formulario América / Nueva_York , correspondiente a la zona horaria local del sistema, para mostrar al usuario. Cada pieza de código que he visto que accede a la información de la zona horaria solo devuelve un desplazamiento numérico (-0400) o un código de letras (EDT) o, a veces, ambos. ¿Existe alguna biblioteca de Python que pueda acceder a esta información o, si no, que convierta el código de desplazamiento / letra en un nombre legible para el ser humano?

Si hay más de un nombre legible para el hombre correspondiente a una zona horaria en particular, o bien una lista de los posibles resultados o cualquiera de ellos está bien, y si no hay un nombre legible para el hombre que corresponda a la zona horaria actual, tomaré ya sea una excepción o None o [] o lo que sea.

http://pytz.sourceforge.net/ puede ser de ayuda. Si no es nada más, puede obtener una lista de todas las zonas horarias y luego iterar hasta encontrar una que coincida con su desplazamiento.

Lo siguiente genera una asignación de zonas horarias de asignación de zonas predeterminadas (por ejemplo, ‘-0400’) y abreviaturas (por ejemplo, ‘EDT’) a nombres de zonas horarias geográficas comunes (por ejemplo, ‘América / Nueva_York’).

 import os import dateutil.tz as dtz import pytz import datetime as dt import collections result=collections.defaultdict(list) for name in pytz.common_timezones: timezone=dtz.gettz(name) now=dt.datetime.now(timezone) offset=now.strftime('%z') abbrev=now.strftime('%Z') result[offset].append(name) result[abbrev].append(name) print(result) 

Tenga en cuenta que las abreviaturas de la zona horaria pueden tener significados muy diferentes . Por ejemplo, ‘EST’ podría representar el horario de verano del este (UTC + 10) en Australia, o el horario estándar del este (UTC-5) en América del Norte.

Además, las compensaciones y abreviaturas pueden cambiar para las regiones que utilizan el horario estándar de luz diurna. Por lo tanto, guardar el dictado estático puede no proporcionar el nombre correcto de la zona horaria los 365 días del año.

Me gustaría poder obtener un nombre de zona horaria “legible por humanos” del formulario América / Nueva_York, correspondiente a la zona horaria local del sistema, para mostrarlo al usuario.

Hay tzlocal módulo tzlocal que devuelve un objeto pytz tzinfo que corresponde a la zona horaria local del sistema:

 #!/usr/bin/env python import tzlocal # $ pip install tzlocal print(tzlocal.get_localzone().zone) # display "human-readable" name (tzid) # -> Europe/Moscow 

Para responder a la pregunta en el título (para personas de Google), puede usar %Z%z para imprimir la información de la zona horaria local:

 #!/usr/bin/env python import time print(time.strftime('%Z%z')) # -> MSK+0300 

Imprime la abreviatura de la zona horaria actual y el desplazamiento de utc correspondiente a su zona horaria local.

Si solo quiere literalmente lo que solicitó, “el nombre de la zona horaria del formulario América / Nueva_York, correspondiente a la zona horaria local del sistema”, y si solo le importa Linux (y similares), entonces esto debería hacer el trabajo:

 import os import os.path import sys def main(argv): tzname = os.environ.get('TZ') if tzname: print tzname elif os.path.exists('/etc/timezone'): print file('/etc/timezone').read() else: sys.exit(1) if __name__ == '__main__': main(sys.argv) 

Por supuesto, sería mejor tener una biblioteca que encapsule esto de una manera más limpia, y que quizás maneje los otros casos que mencionas en los comentarios, como si ya tuviera un objeto tzinfo . Creo que puedes hacer eso con pytz mencionado por Amber, pero no es obvio para mí cómo …

Echa un vistazo a python-dateutil

 py> from dateutil.tz import * py> ny = gettz('America/New York') py> ny._filename '/usr/share/zoneinfo/America/New_York' py> ny._filename.split('/', 4)[-1] 'America/New_York'