Wie konvertiert man ein Python- time.struct_time
Objekt in ein datetime.datetime
Objekt?
Ich habe eine Bibliothek, die die erste und eine zweite Bibliothek bereitstellt, die die zweite will.
Verwenden Sie time.mktime () , um das Zeittupel (in Ortszeit) in Sekunden seit der Epoche umzuwandeln , und verwenden Sie dann datetime.fromtimestamp () , um das datetime-Objekt abzurufen.
from datetime import datetime
from time import mktime
dt = datetime.fromtimestamp(mktime(struct))
tm_isdst
Daten verlieren ? Ich denke , so wird die resultierende Datetime - Objekt in dem Maße naiv bleibt zurückNone
auf.dst()
selbst wennstruct.tm_isdst
ist1
.mktime()
diestm_isdst
berücksichtigt werden soll, und Pythontime.mktime()
ruft die C-mktime()
Funktion in CPython auf.mktime()
kann die falsche Ortszeit wählen, wenn sie nicht eindeutig ist (z. B. während des Übergangs am Ende der Sommerzeit ("Fallback")), wenn dies der Fallstruct.tm_isdst
ist-1
oder wennmktime()
auf der angegebenen Plattform die Eingabe ignoriert wirdtm_isdst
. Wenn die lokale Zeitzone in der Vergangenheit einen anderen utc-Offset hatte und Cmktime()
keine historische tz-Datenbank verwendet, die die alten utc-Offset-Werte bereitstellen kann, wirdmktime()
möglicherweise auch ein falscher Wert (z. B. um eine Stunde) zurückgegeben.mktime()
estm_isdst
auf der angegebenen Plattform nicht ignoriert wird (auf meiner), verliert esfromtimestamp()
definitiv die Information: Das zurückgegebene naivedatetime
Objekt, das die Ortszeit darstellt, kann mehrdeutig sein (Zeitstempel -> Ortszeit ist deterministisch (wenn wir Schaltsekunden ignorieren), aberlocal time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also,
fromtimestamp () `wählt möglicherweise einen falschen utc-Offset, wenn keine historische tz-Datenbank verwendet wird.So was:
quelle
*
und**
Syntax können Sie ein Objekt vom Typ listy oder dicty erweitern, um Argumente zu trennen - es ist eines meiner Lieblingsstücke der Python-Schönheit. Siehe docs.python.org/2/tutorial/… für weitere Informationent=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
datetime
:datetime(*t[:5]+(min(t[5], 59),))
zB zu akzeptieren"2015-06-30 16:59:60 PDT"
.Dies ist keine direkte Antwort auf Ihre Frage (die bereits ziemlich gut beantwortet wurde). Nachdem ich mich jedoch mehrmals auf das Fundament gebissen habe, kann ich nicht genug betonen, dass es für Sie wichtig wäre, genau zu betrachten, was Ihr time.struct_time-Objekt bereitstellt, im Vergleich zu den anderen Zeitfeldern.
Angenommen, Sie haben sowohl ein time.struct_time-Objekt als auch eine andere Datums- / Zeitzeichenfolge, vergleichen Sie die beiden und stellen Sie sicher, dass Sie keine Daten verlieren und versehentlich ein naives datetime-Objekt erstellen, wenn Sie dies anders tun können.
Zum Beispiel gibt das ausgezeichnete Feedparser-Modul ein "veröffentlichtes" Feld zurück und kann ein time.struct_time-Objekt in seinem "Published_parsed" -Feld zurückgeben:
Beachten Sie nun, was Sie tatsächlich mit dem Feld "Veröffentlicht" erhalten.
Bei Stallmans Bart! Zeitzoneninformationen!
In diesem Fall möchte der faule Mann möglicherweise das hervorragende Dateutil-Modul verwenden, um die Zeitzoneninformationen zu speichern:
was uns gibt:
Man könnte dann das zeitzonenbewusste datetime-Objekt verwenden, um die gesamte Zeit auf UTC zu normalisieren oder was auch immer Sie für fantastisch halten.
quelle
*_parsed
Felder von feedparsed sind bereits auf UTC normalisiert, wie in der Datumsanalyse-Dokumentation überprüft werden kann, sodass dies redundant ist.datetime
Objekt zu behalten, das verloren geht, wennfeedparser
Rohdaten von Zeichenfolgen analysiert werden.