Jak przekonwertować time.struct_time
obiekt Python na datetime.datetime
obiekt?
Mam bibliotekę, która udostępnia pierwszą i drugą bibliotekę, która chce drugiej.
Użyj time.mktime (), aby przekonwertować krotkę czasu (w czasie lokalnym) na sekundy od Epoki, a następnie użyj datetime.fromtimestamp (), aby uzyskać obiekt datetime.
from datetime import datetime
from time import mktime
dt = datetime.fromtimestamp(mktime(struct))
tm_isdst
danych? Myślę, że tak otrzymany datetime obiekt pozostaje naiwny do tego stopnia, aby powrócićNone
na.dst()
nawet jeślistruct.tm_isdst
jest1
.mktime()
należy wziąćtm_isdst
pod uwagę, a Pythontime.mktime()
wywołujemktime()
funkcję C na CPython.mktime()
może wybrać niewłaściwy czas lokalny, gdy jest niejednoznaczny (np. podczas przejścia na koniec DST („cofnięcia”)), jeślistruct.tm_isdst
jest-1
lub jeślimktime()
na danej platformie ignoruje dane wejściowetm_isdst
. Ponadto, jeśli lokalna strefa czasowa miała w przeszłości inne przesunięcie utc, a Cmktime()
nie korzysta z historycznej bazy danych tz, która może dostarczyć stare wartości przesunięcia utc, wówczasmktime()
może zwrócić również niepoprawną (np. O godzinę) wartość.mktime()
nie ignorujetm_isdst
na danej platformie (działa na mojej), tofromtimestamp()
zdecydowanie traci informacje: zwrócony naiwnydatetime
obiekt reprezentujący czas lokalny może być niejednoznaczny (znacznik czasu -> czas lokalny jest deterministyczny (jeśli zignorujemy sekundy przestępne), alelocal time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also,
fromtimestamp () `może wybrać nieprawidłowe przesunięcie utc, jeśli nie korzysta ono z historycznej bazy danych tz.Lubię to:
źródło
*
i**
składnia pozwala rozwinąć obiekt typu listy lub dicty w celu oddzielenia argumentów - jest to jeden z moich ulubionych elementów uwielbienia Pythona. Aby uzyskać więcej informacji, zobacz docs.python.org/2/tutorial/…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),))
np"2015-06-30 16:59:60 PDT"
. zaakceptować .To nie jest bezpośrednia odpowiedź na twoje pytanie (na które już dość dobrze odpowiedziano). Jednak po kilkakrotnym ugryzieniu mnie w podstawę nie mogę wystarczająco podkreślić, że byłoby dobrze, gdybyś dokładnie przyjrzał się temu, co zapewnia Twój obiekt time.struct_time, a co inne pola czasu mogą mieć.
Zakładając, że masz zarówno obiekt time.struct_time, jak i inny ciąg daty / godziny, porównaj je i upewnij się, że nie tracisz danych i nieumyślnie tworzysz naiwny obiekt daty / godziny, jeśli możesz zrobić inaczej.
Na przykład doskonały moduł Feedparser zwróci pole „opublikowany” i może zwrócić obiekt time.struct_time w polu „opublikowany”:
Teraz zwróć uwagę na to, co faktycznie otrzymujesz w polu „opublikowany”.
Na brodę Stallmana ! Informacje o strefie czasowej!
W takim przypadku leniwy człowiek może chcieć użyć doskonałego modułu dateutil do zachowania informacji o strefie czasowej:
co daje nam:
Następnie można użyć obiektu datetime rozpoznającego strefę czasową, aby znormalizować cały czas do UTC lub cokolwiek, co uważasz za niesamowite.
źródło
*_parsed
pola z feedparsed są już znormalizowane do UTC, co można sprawdzić w dokumentacji parsowania daty, więc jest to zbędne.datetime
obiekcie, który jest tracony podczasfeedparser
analizy nieprzetworzonych dat ciągu.