¿Hay una lista de zonas horarias de Pytz?

660

Me gustaría saber cuáles son todos los valores posibles para el argumento de zona horaria en la biblioteca Python pytz. ¿Cómo hacerlo?

ipegasus
fuente
66
Es curioso cómo "GMT", "GMT + 0", "GMT-0", "GMT0", "Greenwich", "UCT", "UTC", "Universal" y "Zulu" significan básicamente lo mismo y Sin embargo, hay tantas entradas para ello.
Joe Z.
43
GMT no es lo mismo que UTC. Es un error común.
PawelRoman
1
@PawelRoman: GMT puede significar cosas diferentes en un contexto diferente. Se hace UTC media veces por ejemplo, certificados SSL cadenas de tiempo como aceptado requiere GMT ( legado). ssl.cert_time_to_second() ASN1_TIME_print()
jfs
3
@PawelRoman tienes razón en el sentido de que uno es una zona horaria y el otro es un estándar. Pero en el sentido práctico que la mayoría de la gente piensa, ambos se refieren al mismo momento en el tiempo.
robar
1
@YongweiWu ver stackoverflow.com/questions/11473721/…
Mark Ransom

Respuestas:

319

Puede enumerar todas las zonas horarias disponibles con pytz.all_timezones:

In [40]: import pytz
In [41]: pytz.all_timezones
Out[42]: 
['Africa/Abidjan',
 'Africa/Accra',
 'Africa/Addis_Ababa',
 ...]

También hay pytz.common_timezones:

In [45]: len(pytz.common_timezones)
Out[45]: 403

In [46]: len(pytz.all_timezones)
Out[46]: 563
unutbu
fuente
99
Además de all_timezones, Pytz también proporciona common_timezones .
Mark Hildreth
3
¿Por qué falta China?
Adders
44
China usa una sola zona horaria , cuyo nombre de zona horaria es 'Asia/Shanghai'.
unutbu
1
Esta expresión muestra el terrible resultado que puede dar pytz: (datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai')) - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC'))).total_seconds()(el resultado no es -28800). Evitaré pytz: dateutil.tz proporciona funcionalidades similares pero usa la base de datos de zona horaria del sistema operativo y no tiene tales problemas.
Yongwei Wu
2
@YongweiWu es un uso incorrecto de la API. No debe pasar una zona horaria pytz con un desplazamiento utc no fijo como argumento tzinfo directamente. Utilice el método .localize () como sugieren los documentos de Pytz.
jfs
38

No cree su propia lista : pytztiene un conjunto incorporado:

import pytz
set(pytz.all_timezones_set)  
>>> {'Europe/Vienna', 'America/New_York', 'America/Argentina/Salta',..}

Luego puede aplicar una zona horaria :

import datetime
tz = pytz.timezone('Pacific/Johnston')
ct = datetime.datetime.now(tz=tz)
>>> ct.isoformat()
2017-01-13T11:29:22.601991-05:00

O si ya tiene un datetimeobjeto que es consciente de TZ (no ingenuo):

# This timestamp is in UTC
my_ct = datetime.datetime.now(tz=pytz.UTC)

# Now convert it to another timezone
new_ct = my_ct.astimezone(tz)
>>> new_ct.isoformat()
2017-01-13T11:29:22.601991-05:00
chribsen
fuente
27

El nombre de la zona horaria es la única forma confiable de especificar la zona horaria.

Puede encontrar una lista de nombres de zonas horarias aquí: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones Tenga en cuenta que esta lista contiene muchos nombres de alias, como US / Eastern para la zona horaria que se llama correctamente America / New_York.

Si programáticamente desea crear esta lista desde la base de datos zoneinfo, puede compilarla desde el archivo zone.tab en la base de datos zoneinfo. No creo que pytz tenga una API para obtenerlos, y tampoco creo que sea muy útil.

Lennart Regebro
fuente
14

Aquí, la lista de Python de códigos de país, nombres, continentes, capitales y zonas horarias de pytz.

countries = [
{'timezones': ['Europe/Paris'], 'code': 'FR', 'continent': 'Europe', 'name': 'France', 'capital': 'Paris'}
{'timezones': ['Africa/Kampala'], 'code': 'UG', 'continent': 'Africa', 'name': 'Uganda', 'capital': 'Kampala'},
{'timezones': ['Asia/Colombo'], 'code': 'LK', 'continent': 'Asia', 'name': 'Sri Lanka', 'capital': 'Sri Jayewardenepura Kotte'},
{'timezones': ['Asia/Riyadh'], 'code': 'SA', 'continent': 'Asia', 'name': 'Saudi Arabia', 'capital': 'Riyadh'},
{'timezones': ['Africa/Luanda'], 'code': 'AO', 'continent': 'Africa', 'name': 'Angola', 'capital': 'Luanda'},    
{'timezones': ['Europe/Vienna'], 'code': 'AT', 'continent': 'Europe', 'name': 'Austria', 'capital': 'Vienna'},
{'timezones': ['Asia/Calcutta'], 'code': 'IN', 'continent': 'Asia', 'name': 'India', 'capital': 'New Delhi'},
{'timezones': ['Asia/Dubai'], 'code': 'AE', 'continent': 'Asia', 'name': 'United Arab Emirates', 'capital': 'Abu Dhabi'},
{'timezones': ['Europe/London'], 'code': 'GB', 'continent': 'Europe', 'name': 'United Kingdom', 'capital': 'London'},
]

Para la lista completa: Gist Github

Espero eso ayude.

Jay Modi
fuente
4

Parecen estar poblados por las zonas horarias de la base de datos tz que se encuentran aquí .

ingrese la descripción de la imagen aquí

Chris Redford
fuente
1
pytzproporciona acceso a la base de datos tz (es la fuente de los datos de wikipedia).
jfs
4

EDITAR: Le agradecería que no desestime más esta respuesta. Esta respuesta es incorrecta , pero prefiero conservarla como una nota histórica. Si bien es discutible si la interfaz pytz es propensa a errores, puede hacer cosas que dateutil.tz no puede hacer, especialmente con respecto al horario de verano en el pasado o en el futuro. Honestamente he registrado mi experiencia en un artículo "Zonas horarias en Python" .


Si estás en una plataforma tipo Unix, te sugiero que evites pytz y veas solo / usr / share / zoneinfo. dateutil.tz puede utilizar la información allí.

El siguiente fragmento de código muestra el problema que puede causar pytz. Me sorprendió cuando lo descubrí por primera vez. (Curiosamente, el pytz instalado por yum en CentOS 7 no presenta este problema).

import pytz
import dateutil.tz
from datetime import datetime
print((datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai'))
     - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC')))
     .total_seconds())
print((datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.gettz('Asia/Shanghai'))
     - datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.tzutc()))
     .total_seconds())

-29160.0
-28800.0

Es decir, la zona horaria creada por pytz es para la hora local real, en lugar de la hora local estándar que la gente observa. Shanghai se ajusta a +0800, no a +0806 como sugiere pytz:

pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

EDITAR: Gracias al comentario y voto negativo de Mark Ransom, ahora sé que estoy usando pytz de manera incorrecta. En resumen, se supone que no debe pasar el resultado de pytz.timezone(…)to datetime, pero debe pasarlo datetimea su localizemétodo.

A pesar de su argumento (y mi mal por no leer la documentación de Pytz con más cuidado), voy a mantener esta respuesta. Estaba respondiendo la pregunta de una manera (cómo enumerar las zonas horarias admitidas, aunque no con pytz), porque creía que pytz no proporcionaba una solución correcta. Aunque mi creencia era errónea, esta respuesta aún proporciona información, en mi humilde opinión, que es potencialmente útil para las personas interesadas en esta pregunta. La forma correcta de hacer las cosas de Pytz es contra-intuitiva. Demonios , si el tzinfo creado por pytz no debería ser utilizado directamente por datetime, debería ser un tipo diferente. La interfaz pytz está simplemente mal diseñada. El enlace proporcionado por Mark muestra que muchas personas, no solo yo, han sido engañadas por la interfaz pytz.

Yongwei Wu
fuente
2
Consulte stackoverflow.com/questions/11473721/… para una solución. No hay nada malo pytz, solo lo estás usando mal. PD: Esta no es una respuesta a la pregunta en absoluto .
Mark Ransom
1
@MarkRansom Buena información, y es bueno saberlo. Sin embargo, no compro tu argumento. La interfaz está diseñada incorrectamente, punto. Es muy contradictorio.
Yongwei Wu
3
Sí, la interfaz está diseñada incorrectamente. Pero es la datetimeinterfaz la que está mal, no pytz. datetimeno anticipó objetos inteligentes de zona horaria, por lo que su interfaz no los inicializa correctamente.
Mark Ransom
1
Con respeto, no estoy de acuerdo. datetimees parte de la biblioteca estándar de Python, y es pytz el que debe seguir la datetimeinterfaz, no viceversa. Si alguien pudiera implementar alguna interfaz en la forma en que piensan mejor sin consenso, no habría un software robusto.
Yongwei Wu
2
Como dije, pytzno puedo seguir la datetimeinterfaz porque la datetimeinterfaz es deficiente. Los autores de esa interfaz no anticiparon los problemas de una zona horaria cuyos parámetros cambian con los años. El hecho de que sea parte de la distribución estándar de Python no significa que sea perfecta.
Mark Ransom
-8

En mi opinión, este es un defecto de diseño de la biblioteca Pytz. Debería ser más confiable especificar una zona horaria utilizando el desplazamiento, por ejemplo

pytz.construct("UTC-07:00")

que te da la zona horaria de Canadá / Pacífico.

Jinghui Niu
fuente
12
Las compensaciones cambian a lo largo del año (generalmente debido al horario de verano), por lo que no es lo mismo que normalmente consideramos como una zona horaria.
Ryan Hiebert
La sintaxis elegida se basa en las definiciones en tzdata .
Brad Koch