Je dois convertir une chaîne sensible à un fuseau horaire en objet datetime
de python.
Par exemple 2012-11-01T04:16:13-04:00
.
Je trouve qu'il existe un module dateutil
qui dispose d'une fonction d'analyse pour le faire, mais je ne veux pas vraiment l'utiliser car il ajoute une dépendance.
Alors, comment puis-je le faire? J'ai essayé quelque chose comme ce qui suit, mais sans succès.
datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")
À partir de Python 3.7, datetime.datetime.fromisoformat()
peut gérer votre format:
>>> import datetime
>>> datetime.datetime.fromisoformat('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))
Dans les anciennes versions de Python, vous ne pouvez pas le faire, sans une définition minutieuse du fuseau horaire.
Python n'inclut pas de base de données de fuseau horaire, car celle-ci serait obsolète trop rapidement. Au lieu de cela, Python s'appuie sur des bibliothèques externes, dont le cycle de publication est beaucoup plus rapide, pour vous fournir des fuseaux horaires correctement configurés.
En tant qu'effet secondaire, cela signifie que le fuseau horaire analysant doit également être une bibliothèque externe. Si dateutil
est trop lourd pour vous, utilisez iso8601
, il analysera parfaitement votre format spécifique:
>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)
iso8601
est un énorme 4Ko petit. Comparez-le à 148 Ko de python-dateutil
.
À partir de Python 3.2 Python peut gérer des fuseaux horaires basés sur des décalages simples, et %z
analysera -hhmm
et +hhmm
décalage de fuseau horaire dans un horodatage. Cela signifie que pour un horodatage ISO 8601, vous devez supprimer le :
dans le fuseau horaire:
>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))
L'absence d'analyse ISO 8601 appropriée est en cours de suivi dans numéro de Python 1587 .
Voici l'objet Python Doc for datetime utilisant le package dateutil.
from dateutil.parser import parse
get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
Le code de la question initiale pose deux problèmes: il ne devrait pas y avoir de ":" dans le fuseau horaire et la chaîne de format pour "fuseau horaire en tant que décalage" n'est pas une majuscule "% z" ni supérieure à "% Z".
Cela fonctionne pour moi dans Python v3.6
>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00
Je suis nouveau sur Python, mais j'ai trouvé un moyen de convertir
2017-05-27T07:20:18.000-04:00
to
2017-05-27T07:20:18
sans télécharger de nouveaux utilitaires.
from datetime import datetime, timedelta
time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04
item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)
Je suis sûr qu'il existe de meilleures façons de le faire sans couper autant la ficelle, mais le travail a été fait.
Vous pouvez convertir comme ça.
date = datetime.datetime.strptime('2019-3-16T5-49-52-595Z','%Y-%m-%dT%H-%M-%S-%f%z')
date_time = date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')