21 Stimmen

Python | mktime Überlauffehler

Ich habe im ganzen Netz gesucht und konnte keine geeignete Lösung für dieses Problem finden

OverflowError: mktime argument out of range

Der Code, der diese Ausnahme verursacht

 t = (1956, 3, 2, 0, 0, 0, 0, 0, 0)
 ser = time.mktime(t)

Ich möchte den tatsächlichen Grund für diese Ausnahme wissen, einige sagen, dass das Datum nicht in einem gültigen Bereich ist, aber es macht keinen Sinn für mich, und wenn es einen Bereich gibt, was es sein könnte. Ist es abhängig von dem System, das wir verwenden. Ich würde auch gerne eine gute Lösung für dieses Problem kennen.

Danke.

28voto

Tamás Punkte 45697

time.mktime ruft die zugrunde liegende mktime Funktion aus der C-Bibliothek der Plattform. Zum Beispiel funktioniert der obige Code, den Sie gepostet haben, für mich unter Mac OS X perfekt, obwohl er eine negative Zahl zurückgibt, da das Datum vor der Unix-Epoche liegt. Der Grund ist also, dass die Funktion Ihrer Plattform mktime Implementierung unterstützt wahrscheinlich keine Daten vor der Unix-Epoche. Sie können Pythons datetime Modul zur Konstruktion eines datetime Objekt, das dem oben genannten Datum entspricht, und subtrahieren Sie es von einem anderen datetime Objekt, das die Unix-Epoche darstellt, und verwenden Sie die berechnete timedelta Objekt, um die Anzahl der Sekunden seit der Epoche zu ermitteln:

from datetime import datetime
epoch = datetime(1970, 1, 1)
t = datetime(1956, 3, 2)
diff = t-epoch
print diff.days * 24 * 3600 + diff.seconds

Update : Wenn Sie Python 2.7 oder höher verwenden, können Sie einfach print diff.total_seconds() wie unten im Kommentar von Chad Miller erwähnt.

3voto

The Demz Punkte 6736

Python Zeit Modul

Obwohl dieses Modul immer verfügbar ist, sind nicht alle Funktionen auf allen Plattformen verfügbar. Die meisten der in diesem Modul definierten Funktionen Modul definierten Funktionen rufen Plattform-C-Bibliotheksfunktionen mit demselben Namen. Es kann manchmal hilfreich sein, die Plattformdokumentation zu konsultieren, da die Semantik dieser Funktionen von Plattform zu Plattform unterschiedlich ist.

Die Epoche ist der Punkt, an dem die Zeit beginnt, und ist plattform abhängig. Für Unix ist die Epoche der 1. Januar 1970, 00:00:00 (UTC). Um herauszufinden, was die Epoche auf einer bestimmten Plattform ist, schauen Sie in time.gmtime(0).

https://docs.python.org/3/library/time.html

Windows 10:

>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

>>> list((ix for ix in time.gmtime(0)))
[1970, 1, 1, 0, 0, 0, 3, 1, 0]

>>> time.mktime(time.gmtime(0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: mktime argument out of range

Die C-Bibliotheksfunktion unter Windows 10 unterstützt keine Zeiten unterhalb eines bestimmten Wertes.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X