web-dev-qa-db-fra.com

Convertir la chaîne de date JSON en Python datetime

Lors de la traduction des dates en JSON, javascript enregistre les dates dans ce format:

2012-05-29T19:30:03.283Z

Cependant, je ne sais pas comment obtenir ceci dans un objet python datetime. J'ai essayé ces derniers:

# Throws an error because the 'Z' isn't accounted for:
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f')

# Throws an error because '%Z' doesn't know what to do with the 'Z'
#  at the end of the string
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f%Z')

Je crois que javascript enregistre la chaîne au format ISO officiel, il semble donc qu'il devrait y avoir un moyen d'obtenir la datetime.strptime() de python pour la lire?

29
Chris Dutrow

Essayez le format suivant:

%Y-%m-%dT%H:%M:%S.%fZ

Par exemple:

>>> datetime.datetime.strptime('2012-05-29T19:30:03.283Z', '%Y-%m-%dT%H:%M:%S.%fZ')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)

Le Z dans la date signifie simplement qu'il doit être interprété comme une heure UTC, donc l'ignorer ne causera aucune perte d'information. Vous pouvez trouver ces informations ici: http://www.w3.org/TR/NOTE-datetime

42
Andrew Clark

Pour fournir une alternative, si cela ne vous dérange pas d'installer le python-dateutil package, vous pouvez utiliser dateutil.parser.parse . Sachez que le format de l'entrée est deviné par parse; une entrée non valide peut toujours être interprétée, correctement ou autrement.

Sans fuseau horaire

Si vous préférez ne pas avoir le fuseau horaire défini, ce qui est parfaitement bien si vous représentez toutes les heures en interne uniquement en UTC, utilisez:

>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z', ignoretz=True)
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)

Avec fuseau horaire

Notez que contrairement à datetime.datetime.strptime, cet appel par défaut à parse préserve automatiquement le fuseau horaire UTC.

>>> import dateutil.parser
>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=tzutc())

Si une affirmation de test pour l'égalité doit être faite, l'objet attendu peut être construit comme:

>>> import datetime
>>> datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=dateutil.tz.tzutc())
7
Acumenus