Wie konvertieren Sie eine Zeit.struct_time-Objekt in ein datetime-Objekt?
Wie konvertieren Sie eine Python - time.struct_time
- Objekt in ein datetime.datetime
Objekt?
Ich habe eine Bibliothek, die die erste und eine zweite Bibliothek, die will das zweite.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Zeit.mktime() zu konvertieren die Zeit Tupel (in lokaler Zeit) in Sekunden seit der Epoche, dann verwenden Sie datetime.fromtimestamp() man das datetime-Objekt.
tm_isdst
Daten? Ich denke also, die resultierende datetime-Objekt bleibt naiv, zu dem Maße zurückNone
auf.dst()
auch wennstruct.tm_isdst
ist1
.mktime()
nehmen solltetm_isdst
berücksichtigt und Pythontime.mktime()
ruft Cmktime()
Funktion auf CPython.mktime()
können, wählen Sie die falsche lokale Zeit, wenn es mehrdeutig ist (z.B., während der Ende-der-Sommerzeit ("fall back") - übergang), wennstruct.tm_isdst
ist-1
oder wennmktime()
auf der Plattform ignoriert das Eingabetm_isdst
. Auch, wenn die lokale Zeitzone hatte unterschiedliche utc-offset in der Vergangenheit und Cmktime()
nicht mit einem historischen tz-Datenbank, die den alten utc-offset-Werte dannmktime()
möglicherweise ein Falsches (z.B. eine Stunde) Wert zu.mktime()
nicht ignorierentm_isdst
auf der angegebenen Plattform (es tut mir) dannfromtimestamp()
jeden Fall verliert die info: das zurückgegebene naivdatetime
Objekt, das die lokale Zeit kann mehrdeutig sein (timestamp -> lokale Zeit deterministisch (wenn wir ignorieren, leap seconds), aberlocal time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also,
fromtimestamp()` können wählen, eine falsche utc-offset, wenn die es keine historischen tz-Datenbank.datetime.fromtimestamp(mktime((2015,6,1,0,0,0,0,0,0)))
->datetime.datetime(2015, 6, 1, 1, 0)
. Dies kann sein, was Sie wollen, aber es verursacht mir Probleme. Du hast Recht, dass es weitere Probleme rund um die Skillungmktime()
und wie historische tz Daten umgegangen wird. Wirklich dies alles geht zu zeigen, dass (wie bereits von @lysdexia), datetime Konvertierung ist kompliziert, und Sie müssen denken Sie sorgfältig darüber.mktime()
auf meiner Plattform immer gibt das richtige Ergebnis (einschließlich DST/non-DST), wenn der Eingang mal struct ist nicht zweideutig ist (oder nicht vorhanden), d.h., es kann falsch sein, nur während DST übergänge (es ignoriert die Eingabetm_isdst
) (das ist der Grund, warumpytz.timezone.localize()
Methode hatis_dst
- parameter: erlauben disambiguation) oder um eine positive Schaltsekunde einfügen. Ich bekommedatetime(2015,6,1,0,0)
(nichtdatetime(2015,6,1,1,0)
) auf meinem Rechner (es gibt keine Sommerzeit-übergang damals in meinem lokalen Zeitzone).datetime.fromtimestamp()
wandelt es mit der Sommerzeit-Zeit korrigiert.America/New_York
Zeitzone. Es ist falsch zu übergebentm_isdst=0
für diesen Tag (2015-06-01
) in dieser Zeitzone. Wenn Sie übergeben die erwartete Datum1
oder-1
(damitmktime()
um herauszufinden, von selbst die richtigetm_isdst
Wert), dannmktime()
gibt Sie den richtigen Zeitstempel. Ich war falsch:mktime()
kann auch wieder ein Falsches Ergebnis, eine falsche Eingabe, auch wenn es keine Sommerzeit-übergang an diesem Tag.fromtimestamp()
funktioniert, dass Datum auf meinem system.Wie diese:
*
und**
- syntax können Sie erweitern eine listy oder dicty Typ object in getrennten Argumente - es ist einer meiner Lieblings-Stücke von Python lovelyness. Siehe docs.python.org/2/tutorial/... für mehr infotime
ist nicht erforderlich, wenn Sie bereitstime.struct_time
Objekt.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),))
z.B., zu akzeptieren"2015-06-30 16:59:60 PDT"
.Dies ist keine direkte Antwort auf deine Frage (die beantwortet wurde Recht gut schon). Jedoch, hatte mal Biss mir auf das fundament mehrmals, ich kann nicht genug betonen, dass es wäre gut beraten, Sie genau zu prüfen, was Ihre Zeit.struct_time-Objekt bietet, gegenüber dem was andere Uhrzeit-Felder haben können.
Vorausgesetzt, Sie haben beide eine Zeit.struct_time-Objekt und einige andere Datum - /Uhrzeit-Zeichenfolge, die beiden vergleichen und sicher sein, Sie sind nicht Daten zu verlieren und versehentlich erstellen eine naive datetime-Objekt aus, wenn Sie kann nicht anders.
Zum Beispiel, die ausgezeichnete feedparser-Modul zurück "veröffentlicht" - Feld und darf zurück eine Zeit.struct_time-Objekt in seiner "published_parsed" - Feld:
Nun beachten Sie, was bekommen Sie eigentlich mit dem "veröffentlicht" - Feld.
Durch Stallman's BART! Timezone Informationen!
In diesem Fall, die faul Mann könnte wollen, verwenden Sie die hervorragende dateutil-Modul halten Sie die Zeitzone-Informationen:
gibt uns:
Könnte man dann verwenden Sie den Zeitzone-bewusst datetime-Objekt zu normalisieren, alle Zeiten in UTC oder was auch immer Sie denken ist genial.
*_parsed
Felder aus feedparsed sind bereits normiert auf UTC-wie kann überprüft werden, in der Datum-Analyse-Dokumentation also, das ist redundant.