webentwicklung-frage-antwort-db.com.de

Wie konvertiert man eine timezone-fähige Zeichenfolge in datum in datum ohne dateutil?

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

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

55
Martijn Pieters

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
30

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

Ich bin neu in Python, habe aber einen Weg gefunden, zu konvertieren 

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

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.

0
wiseco68

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