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.
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.
Antworten:
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ück None
auf .dst()
selbst wenn struct.tm_isdst
ist 1
.
mktime()
dies tm_isdst
berücksichtigt werden soll, und Python time.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 Fall struct.tm_isdst
ist -1
oder wenn mktime()
auf der angegebenen Plattform die Eingabe ignoriert wird tm_isdst
. Wenn die lokale Zeitzone in der Vergangenheit einen anderen utc-Offset hatte und C mktime()
keine historische tz-Datenbank verwendet, die die alten utc-Offset-Werte bereitstellen kann, wird mktime()
möglicherweise auch ein falscher Wert (z. B. um eine Stunde) zurückgegeben.
mktime()
es tm_isdst
auf der angegebenen Plattform nicht ignoriert wird (auf meiner), verliert es fromtimestamp()
definitiv die Information: Das zurückgegebene naive datetime
Objekt, das die Ortszeit darstellt, kann mehrdeutig sein (Zeitstempel -> Ortszeit ist deterministisch (wenn wir Schaltsekunden ignorieren), aber local 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:
>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)
*
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 Informationen
t=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:
time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)
Beachten Sie nun, was Sie tatsächlich mit dem Feld "Veröffentlicht" erhalten.
Mon, 09 Sep 2013 19:57:42 -0400
Bei Stallmans Bart! Zeitzoneninformationen!
In diesem Fall möchte der faule Mann möglicherweise das hervorragende Dateutil-Modul verwenden, um die Zeitzoneninformationen zu speichern:
from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()
was uns gibt:
published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00
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.
*_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, wenn feedparser
Rohdaten von Zeichenfolgen analysiert werden.