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.
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:
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
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.
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).
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:
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.
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
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 .
ssl.cert_time_to_second()
ASN1_TIME_print()
Respuestas:
Puede enumerar todas las zonas horarias disponibles con
pytz.all_timezones
:También hay
pytz.common_timezones
:fuente
all_timezones
, Pytz también proporcionacommon_timezones
.'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:Luego puede aplicar una zona horaria :
O si ya tiene un
datetime
objeto que es consciente de TZ (no ingenuo):fuente
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.
fuente
Aquí, la lista de Python de códigos de país, nombres, continentes, capitales y zonas horarias de pytz.
Para la lista completa: Gist Github
Espero eso ayude.
fuente
Parecen estar poblados por las zonas horarias de la base de datos tz que se encuentran aquí .
fuente
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).
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:
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(…)
todatetime
, pero debe pasarlodatetime
a sulocalize
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.fuente
pytz
, solo lo estás usando mal. PD: Esta no es una respuesta a la pregunta en absoluto .datetime
interfaz la que está mal, nopytz
.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 ladatetime
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 ladatetime
interfaz porque ladatetime
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
que te da la zona horaria de Canadá / Pacífico.
fuente