How to convert Python's .isoformat() string back into datetime object

So in Python 3, you can generate an ISO 8601 date with .isoformat(), but you can't convert a string created by isoformat() back into a datetime object because Python's own datetime directives don't match properly. That is, %z = 0500 instead of 05:00 (which is produced by .isoformat()).

For example:

    >>> strDate = d.isoformat()
    >>> strDate

    >>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python34\Lib\", line 500, in _strptime_datetime
        tt, fraction = _strptime(data_string, format)
      File "C:\Python34\Lib\", 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'

From Python's strptime documentation: (

%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive). (empty), +0000, -0400, +1030

So, in short, Python does not even adhere to its own string formatting directives.

I know datetime is already terrible in Python, but this really goes beyond unreasonable into the land of plain stupidity.

Tell me this isn't true.

As it turns out, this is the current best "solution" to this question:

    pip install python-dateutil


    import datetime
    import dateutil.parser

    def getDateTimeFromISO8601String(s):
        d = dateutil.parser.parse(s)
        return d