Zeitdelta in Gesamtsekunden umrechnen


185

Ich habe einen Zeitunterschied

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

Wie finde ich nun die Gesamtzahl der Sekunden, die vergangen sind? diff.secondszählt keine Tage. Ich könnte:

diff.seconds + diff.days * 24 * 3600

Gibt es dafür eine eingebaute Methode?


8
@ RestRisiko - du hast recht. Trotzdem ist es nützlich, die Frage zum Stapelüberlauf zu haben. Wenn ich oder jemand anderes das nächste Mal googelt, hat er eine gute Antwort als Top-Ergebnis.
Ripper234

Wir können später alternative Definitionen von "gut" diskutieren; Bitte lesen Sie meine Antwort, bevor Sie weglaufen :)
John Machin

Es gibt mehrere Probleme mit der Datenverarbeitung time1und diffin Ihrem Code. Verwenden Sie datetime.utcnow()stattdessen, um die aktuelle utc-Zeit als naives datetime-Objekt abzurufen . Um zu verstehen, warum Sie UTC anstelle der Ortszeit verwenden sollten, um den Unterschied zu ermitteln, lesen Sie Suchen, wenn zwischen den Datenzeiten 24 Stunden vergangen sind - Python . time.monotonic()Es könnte vorzuziehen sein, die zwischen den Ereignissen verstrichene Zeit zu ermitteln (anstelle von time.time()oder datetime.utcnow()).
JFS

Antworten:


382

Verwenden Sie timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0

26
Neu in Python 2.7
Evgeny

7
Wenn jemand noch mit 2.6 kompatibel sein muss: Informationen zum Erweitern von datetime.timedelta mit der neuen Methode finden Sie unter stackoverflow.com/questions/3318348/….
Uwe Geuder

6
datetime.timedelta.total_seconds (time2-time1) in Python3.6
Russo

8

Sie haben auf die eine oder andere Weise ein Problem mit Ihrem datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))Ausdruck.

(1) Wenn Sie nur den Unterschied zwischen zwei Zeitpunkten in Sekunden benötigen, time.time()erledigt der sehr einfache Job die Aufgabe.

(2) Wenn Sie diese Zeitstempel für andere Zwecke verwenden, müssen Sie überlegen, was Sie tun, da das Ergebnis überall stark riecht:

gmtime()Gibt ein Zeittupel in UTC zurück , mktime()erwartet jedoch ein Zeittupel in der Ortszeit.

Ich bin in Melbourne, Australien, wo die Standard-TZ UTC + 10 ist, aber die Sommerzeit ist noch bis morgen früh in Kraft, also ist es UTC + 11. Als ich Folgendes ausführte, war es 2011-04-02T20: 31 Ortszeit hier ... UTC war 2011-04-02T09: 31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

Sie werden feststellen, dass t3, das Ergebnis Ihres Ausdrucks, UTC + 1 ist, was UTC + (mein lokaler DST-Unterschied) zu sein scheint ... nicht sehr aussagekräftig. Sie sollten in Betracht ziehen, datetime.datetime.utcnow()die zu verwenden, die beim Ein- und Ausschalten der Sommerzeit nicht um eine Stunde springt und möglicherweise präziser ist alstime.time()


Danke für die Klarstellung. Für den Zweck, den ich gerade benutze, ist ein Unterschied von ein paar Stunden hin und wieder nicht wichtig, aber ich werde dies in Zukunft sicher überprüfen, wenn ich etwas aussagekräftigeres schreibe.
Ripper234

-7

Sie können das Modul mx.DateTime verwenden

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.