web-dev-qa-db-fra.com

Comment convertir une chaîne sensible à un fuseau horaire en datetime en python sans dateutil?

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")
44
lxyu

À 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 .

57
Martijn Pieters

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
30

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
2
Jamie Czuy

Je suis nouveau sur Python, mais j'ai trouvé un moyen de convertir 

2017-05-27T07:20:18.000-04:00to

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.

0
wiseco68

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')
0
Muruganandam C