Ich muss eine zeitzonenbewusste Zeichenfolge wie "2012-11-01T04:16:13-04:00"
in ein Python- datetime
Objekt konvertieren .
Ich habe das dateutil
Modul gesehen, 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 so 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")
Antworten:
Ab Python 3.7
datetime.datetime.fromisoformat()
können Sie Ihr Format verarbeiten:>>> 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 eine Menge sorgfältiger manueller Zeitzonendefinitionen.
Python enthält keine Zeitzonendatenbank, da diese zu schnell veraltet wäre. Stattdessen stützt sich Python auf externe Bibliotheken, die einen weitaus schnelleren Veröffentlichungszyklus haben können, um ordnungsgemäß konfigurierte Zeitzonen für Sie bereitzustellen.
Als Nebeneffekt bedeutet dies, dass das Parsen der Zeitzone auch eine externe Bibliothek sein muss. Wenn
dateutil
es Ihnen zu schwer ist, verwenden Sie esiso8601
stattdessen. Es analysiert Ihr spezifisches Format einwandfrei:>>> 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 satte 4KB klein. Vergleichen Sie diepython-dateutil
148 KB dieses Tot.Ab Python 3.2 kann Python einfache Offset-basierte Zeitzonen verarbeiten und
%z
analysiert-hhmm
und+hhmm
Zeitzonen-Offsets in einem Zeitstempel. Das bedeutet, dass Sie für einen ISO 8601-Zeitstempel Folgendes:
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 ordnungsgemäßen ISO 8601-Analyse wird in der Python-Ausgabe 15873 verfolgt .
quelle
datetime
, dass es so etwas wieiso8601
ISO 8601-Zeitzonen geben könnte - ein bisschen Parsen und zweitzinfo
Unterklassen.FixedOffset
Klasse zu definieren . Hier ist ein CodebeispielHier ist das Python Doc für datetime-Objekt mit dem dateutil-Paket.
from dateutil.parser import parse get_date_obj = parse("2012-11-01T04:16:13-04:00") print get_date_obj
quelle
Es gibt zwei Probleme mit dem Code in der ursprünglichen Frage: Es sollte keine
:
in der Zeitzone geben und die Formatzeichenfolge für "Zeitzone als Versatz" ist Kleinbuchstaben,%z
nicht Großbuchstaben%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
quelle
print(t)
fügt der Doppelpunkt dem utc-Offset hinzu?isoformat(sep=' ')
für die__str__
Funktion , die die UTC als Offsetdrucke „+ HH: MM“. Die Verwendungprint(t.strftime("%Y-%m-%dT%H:%M:%S%z"))
wird ohne das ":" in der Zeitzone gedruckt.2012-11-01T04:16:13-04:00
. OP versucht, diese Form zu analysieren.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')
quelle
Ich bin neu in Python, habe aber einen Weg gefunden, um zu konvertieren
2017-05-27T07:20:18.000-04:00
zu2017-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 stark zu zerschneiden, aber das hat den Job erledigt.
quelle