web-dev-qa-db-fra.com

Comment reconvertir la chaîne .isoformat () de Python en objet datetime

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.

70
Alex Urcioli

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
57
Alex Urcioli

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)
15
user 12321