example create biblioteca python datetime timezone

create - Python strptime() y zonas horarias?



strftime python (3)

La documentación del módulo de datetime dice:

Devuelve un datetime correspondiente a date_string, analizado según el formato. Esto es equivalente a datetime(*(time.strptime(date_string, format)[0:6])) .

¿Ves eso [0:6] ? Eso te atrapa (year, month, day, hour, minute, second) . Nada más. Sin mención de zonas horarias.

Curiosamente, [Win XP SP2, Python 2.6, 2.7] pasando su ejemplo a time.strptime no funciona, pero si quita el "% Z" y el "EST" funciona. También funciona "UTC" o "GMT" en lugar de "EST". "PST" y "MEZ" no funcionan. Misterioso.

Vale la pena señalar que esto se ha actualizado a partir de la versión 3.2 y la misma documentación ahora también establece lo siguiente:

Cuando se proporciona la directiva% z al método strptime (), se producirá un objeto de fecha y hora consciente. El tzinfo del resultado se establecerá en una instancia de zona horaria.

Tenga en cuenta que esto no funciona con% Z, por lo que el caso es importante. Vea el siguiente ejemplo:

In [1]: from datetime import datetime In [2]: start_time = datetime.strptime(''2018-04-18-17-04-30-AEST'',''%Y-%m-%d-%H-%M-%S-%Z'') In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname())) TZ NAME: None In [4]: start_time = datetime.strptime(''2018-04-18-17-04-30-+1000'',''%Y-%m-%d-%H-%M-%S-%z'') In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname())) TZ NAME: UTC+10:00

Tengo un archivo de volcado CSV de una copia de seguridad de Blackberry IPD, creado usando IPDDump. Las cadenas de fecha / hora aquí se parecen a esto (donde EST es una zona horaria australiana):

Tue Jun 22 07:46:22 EST 2010

Necesito poder analizar esta fecha en Python. Al principio, traté de usar la función strptime() desde datettime.

>>> datetime.datetime.strptime(''Tue Jun 22 12:10:20 2010 EST'', ''%a %b %d %H:%M:%S %Y %Z'')

Sin embargo, por alguna razón, el objeto datetime que vuelve no parece tener ningún tzinfo asociado.

Leí en esta página que aparentemente datetime.strptime descarta silenciosamente tzinfo , sin embargo, revisé la documentación y no puedo encontrar nada documentado here .

He podido analizar la fecha usando una biblioteca de Python de terceros, dateutil , sin embargo, todavía tengo curiosidad sobre cómo estaba usando el strptime() integrado strptime() incorrectamente. ¿Hay alguna manera de hacer que strptime() juegue bien con las zonas horarias?


Recomiendo usar dateutil . Su analizador ha podido analizar cada formato de fecha que he lanzado hasta el momento.

>>> from dateutil import parser >>> parser.parse("Tue Jun 22 07:46:22 EST 2010") datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal()) >>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400") datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400)) >>> parser.parse("Sun") datetime.datetime(2011, 12, 18, 0, 0) >>> parser.parse("10-11-08") datetime.datetime(2008, 10, 11, 0, 0)

y así. No hay que lidiar con tonterías de formato strptime() ... simplemente strptime() una fecha y hace lo correcto.

Actualización : Oops. Me perdí en tu pregunta original que mencionaste que dateutil , lo siento. Pero espero que esta respuesta siga siendo útil para otras personas que tropiezan con esta pregunta cuando tienen preguntas para analizar la fecha y ver la utilidad de ese módulo.


Su cadena de tiempo es similar al formato de hora en rfc 2822 (formato de fecha en el correo electrónico, encabezados http) . Podrías analizarlo usando solo stdlib:

>>> from email.utils import parsedate_tz >>> parsedate_tz(''Tue Jun 22 07:46:22 EST 2010'') (2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000)

Consulte las soluciones que producen objetos datetime con reconocimiento de zona horaria para varias versiones de Python: fecha de análisis con zona horaria de un correo electrónico .

En este formato, EST es semánticamente equivalente a -0500 . Aunque, en general, una abreviatura de zona horaria no es suficiente, para identificar una zona horaria de manera única .