Cómo convertir la cadena .isoformat () de Python de nuevo en el objeto datetime

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)