Ainsi, dans Python 3, vous pouvez générer une date ISO 8601 avec .isoformat (), mais vous ne pouvez pas reconvertir une chaîne créée par isoformat () en un objet datetime car les directives propres à Python datetime ne correspond pas correctement, c’est-à-dire que% z = 0500 au lieu de 05:00 (produit par .isoformat ()).
Par exemple:
>>> 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 "<stdin>", line 1, in <module>
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 documentation strptime de Python: ( https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior) )
% z UTC offset sous la forme + HHMM ou -HHMM (chaîne vide si l'objet est naïf). (vide), +0000, -0400, +1030
En bref, Python n'adhère même pas à ses propres directives de formatage de chaîne.
Je sais que la date et l’heure sont déjà terribles en Python, mais cela va vraiment au-delà de ce qui est déraisonnable dans le pays de la stupide bêtise.
Dis-moi que ce n'est pas vrai.
Il s’avère que c’est la meilleure "solution" actuelle à cette question:
pip install python-dateutil
Ensuite...
import datetime
import dateutil.parser
def getDateTimeFromISO8601String(s):
d = dateutil.parser.parse(s)
return d
Essaye ça:
>>> 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)
Usage:
>>> gt("2008-08-12T12:20:30.656234Z")
datetime.datetime(2008, 8, 12, 12, 20, 30, 656234)