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?
ssl.cert_time_to_second()
ASN1_TIME_print()
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?
ssl.cert_time_to_second()
ASN1_TIME_print()
Respuestas:
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
'Asia/Shanghai'
.
(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.
No cree su propia lista : pytz
tiene 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 datetime
objeto 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
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.
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.
Parecen estar poblados por las zonas horarias de la base de datos tz que se encuentran aquí .
pytz
proporciona acceso a la base de datos tz (es la fuente de los datos de wikipedia).
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 datetime
a su localize
mé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.
pytz
, solo lo estás usando mal. PD: Esta no es una respuesta a la pregunta en absoluto .
datetime
interfaz la que está mal, no pytz
. datetime
no anticipó objetos inteligentes de zona horaria, por lo que su interfaz no los inicializa correctamente.
datetime
es parte de la biblioteca estándar de Python, y es pytz el que debe seguir la datetime
interfaz, no viceversa. Si alguien pudiera implementar alguna interfaz en la forma en que piensan mejor sin consenso, no habría un software robusto.
pytz
no puedo seguir la datetime
interfaz porque la datetime
interfaz 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.
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.