change - strftime python
Python tiempo a la edad, parte 2: zonas horarias (5)
¿Hay una manera real de hacer esto con strptime?
No, pero dado que su formato parece ser una fecha de familia RFC822, puede leerlo mucho más fácilmente utilizando la biblioteca de email lugar:
>>> import email.utils
>>> email.utils.parsedate_tz(''Tue, 22 Jul 2008 08:17:41 +0200'')
(2008, 7, 22, 8, 17, 41, 0, 1, 0, 7200)
(7200 = compensación de zona horaria de UTC en segundos)
Esta pregunta ya tiene una respuesta aquí:
- Python time to age 6 respuestas
Siguiendo con mi pregunta anterior, Python , con respecto a la edad , ahora me he encontrado con un problema relacionado con la zona horaria, y resulta que no siempre va a ser "+0200". Entonces, cuando strptime intenta analizarlo como tal, arroja una excepción.
Pensé en cortar el +0200 con [: -6] o lo que sea, pero ¿hay alguna manera real de hacer esto con strptime?
Estoy usando Python 2.5.2 si es importante.
>>> from datetime import datetime
>>> fmt = "%a, %d %b %Y %H:%M:%S +0200"
>>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0200", fmt)
datetime.datetime(2008, 7, 22, 8, 17, 41)
>>> datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0300", fmt)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/_strptime.py", line 330, in strptime
(data_string, format))
ValueError: time data did not match format: data=Tue, 22 Jul 2008 08:17:41 +0300 fmt=%a, %d %b %Y %H:%M:%S +0200
Nuevo en la versión 2.6.
Para un objeto ingenuo, los códigos de formato% z y% Z se reemplazan por cadenas vacías.
Parece que esto se implementa solo en> = 2.6, y creo que tienes que analizarlo manualmente.
No puedo ver otra solución que eliminar los datos de la zona horaria:
from datetime import timedelta,datetime
try:
offset = int("Tue, 22 Jul 2008 08:17:41 +0300"[-5:])
except:
print "Error"
delta = timedelta(hours = offset / 100)
fmt = "%a, %d %b %Y %H:%M:%S"
time = datetime.strptime("Tue, 22 Jul 2008 08:17:41 +0200"[:-6], fmt)
time -= delta
Hasta donde sé, strptime()
no reconoce los códigos numéricos de zona horaria. Si sabe que la cadena siempre va a terminar con una especificación de zona horaria de esa forma (+ o - seguida de 4 dígitos), simplemente cortarla y analizarla manualmente parece una cosa perfectamente razonable.
Parece que% Z corresponde a los nombres de zona horaria, no a los desplazamientos.
Por ejemplo, dado:
>>> format = ''%a, %d %b %Y %H:%M:%S %Z''
Puedo analizar:
>>> datetime.datetime.strptime(''Tue, 22 Jul 2008 08:17:41 GMT'', format)
datetime.datetime(2008, 7, 22, 8, 17, 41)
Aunque parece que no hace nada con el huso horario, simplemente observa que existe y es válido:
>>> datetime.datetime.strptime(''Tue, 22 Jul 2008 08:17:41 NZDT'', format)
datetime.datetime(2008, 7, 22, 8, 17, 41)
Supongo que, si lo desea, podría ubicar una asignación de compensaciones a nombres, convertir su entrada y luego analizarla. Sin embargo, podría ser más simple truncar tu entrada.
Puede usar la biblioteca dateutil
que es muy útil:
from datetime import datetime
from dateutil.parser import parse
dt = parse("Tue, 22 Jul 2008 08:17:41 +0200")
## datetime.datetime(2008, 7, 22, 8, 17, 41, tzinfo=tzoffset(None, 7200)) <- dt
print dt
2008-07-22 08:17:41+02:00