Entonces, en Python 3, puede generar una fecha ISO 8601 con .isoformat (), pero no puede convertir una cadena creada por isoformat () de nuevo en un objeto de fecha y hora porque las directivas de fecha y hora de Python no coinciden correctamente. Es decir,% z = 0500 en lugar de 05:00 (producido por .isoformat ()).
Por ejemplo:
>>> strDate = d.isoformat() >>> strDate '2015-02-04T20:55:08.914461+00:00' >>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z") Traceback (most recent call last): File "", line 1, in File "C:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime tt, fraction = _strptime(data_string, format) File "C:\Python34\Lib\_strptime.py", line 337, in _strptime (data_string, format)) ValueError: time data '2015-02-04T20:55:08.914461+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
De la documentación de tiempo de ejecución de Python: ( https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior )
% z UTC offset en la forma + HHMM o -HHMM (cadena vacía si el objeto es ingenuo). (vacío), +0000, -0400, +1030
Entonces, en resumen, Python ni siquiera se adhiere a sus propias directivas de formato de cadena.
Sé que la fecha y la hora ya son terribles en Python, pero esto realmente va más allá de lo irracional a la tierra de la estupidez.
Dime que esto no es cierto.
Como resultado, esta es la mejor “solución” actual a esta pregunta:
pip install python-dateutil
Entonces…
import datetime import dateutil.parser def getDateTimeFromISO8601String(s): d = dateutil.parser.parse(s) return d
Prueba esto:
>>> def gt(dt_str): ... dt, _, us= dt_str.partition(".") ... dt= datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S") ... us= int(us.rstrip("Z"), 10) ... return dt + datetime.timedelta(microseconds=us)
Uso:
>>> gt("2008-08-12T12:20:30.656234Z") datetime.datetime(2008, 8, 12, 12, 20, 30, 656234)