Ich muss einen timezone-fähigen String in ein Python-Objekt datetime
konvertieren.
Zum Beispiel 2012-11-01T04:16:13-04:00
.
Ich finde, dass es ein dateutil
-Modul gibt, das eine Analysefunktion hat, aber ich möchte es nicht wirklich verwenden, da es eine Abhängigkeit hinzufügt.
Wie kann ich das machen? Ich habe etwas wie das Folgende versucht, aber ohne Glück.
datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")
Ab Python 3.7 kann datetime.datetime.fromisoformat()
mit Ihrem Format umgehen:
>>> 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)))
In älteren Python-Versionen ist dies nicht möglich, nicht ohne mühsame manuelle Definition der Zeitzone.
Python enthält keine Zeitzonen-Datenbank, da diese zu schnell veraltet wäre. Stattdessen setzt Python auf externe Bibliotheken, die einen wesentlich schnelleren Release-Zyklus haben können, um für Sie richtig konfigurierte Zeitzonen bereitzustellen.
Als Nebeneffekt bedeutet dies, dass die Zeitzone Parsing auch eine externe Bibliothek sein muss. Wenn dateutil
zu schwer für Sie ist, verwenden Sie stattdessen iso8601
, um Ihr spezifisches Format zu analysieren:
>>> 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
ist ein sausend 4 KB klein. Vergleichen Sie diesen tot python-dateutil
s 148KB.
Ab Python 3.2 handhabt Python can einfache, auf Versatz basierende Zeitzonen, und %z
analysiert -hhmm
und +hhmm
Zeitzonenversätze in einem Zeitstempel. Das bedeutet, dass Sie für einen Zeitstempel nach ISO 8601 den :
in der Zeitzone entfernen müssen:
>>> 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)))
Das Fehlen einer korrekten ISO 8601-Analyse wird in Python-Ausgabe 15873 nachverfolgt.
Hier ist das Python Doc für datetime-Objekt, das das dateutil-Paket verwendet.
from dateutil.parser import parse
get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
In der ursprünglichen Frage gibt es zwei Probleme mit dem Code: In der Zeitzone sollte kein ":" stehen, und die Formatzeichenfolge für "Zeitzone als Versatz" ist "% z" und nicht "% Z".
Dies funktioniert für mich in 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
Ich bin neu in Python, habe aber einen Weg gefunden, zu konvertieren
2017-05-27T07:20:18.000-04:00
to
2017-05-27T07:20:18
ohne neue Dienstprogramme herunterzuladen.
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)
Ich bin mir sicher, dass es bessere Möglichkeiten gibt, dies zu tun, ohne die Saite so sehr aufzuschneiden, aber dies hat die Arbeit erledigt.
Sie können so konvertieren.
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')