Wie überprüfe ich die Differenz zwischen zwei Daten in Sekunden?


180

Es muss einen einfacheren Weg geben, dies zu tun. Ich habe Objekte, die von Zeit zu Zeit aktualisiert werden möchten. Daher möchte ich aufzeichnen, wann sie erstellt wurden, mit dem aktuellen Zeitstempel vergleichen und bei Bedarf aktualisieren.

datetime.datetime hat sich als schwierig erwiesen, und ich möchte nicht in die ctime-Bibliothek eintauchen. Gibt es etwas Einfacheres für so etwas?

Antworten:


514

Wenn Sie Unterschiede zwischen zwei bekannten Daten berechnen möchten, verwenden Sie Folgendes total_seconds:

import datetime as dt

a = dt.datetime(2013,12,30,23,59,59)
b = dt.datetime(2013,12,31,23,59,59)

(b-a).total_seconds()

86400.0

#note that seconds doesn't give you what you want:
(b-a).seconds

0


95
Die "Notiz" ist der wichtigste Teil, den die Leute vermissen. Ich wünschte, ich könnte eine weitere Abstimmung darüber aufgeben.
Dexter

Es gibt Zeiten, in denen ich bemerke, dass es ein scheinbar ... falsches Ergebnis gibt. 59.800 Sekunden für einen Sekundenbruchteil Unterschied. Für kleinere Operationen wie Sekunden-, Millisekunden- oder Mikrosekundenunterschiede könnte man diese verwenden (b-a).microsecondsund dann teilen, um die Sekunden (1000000) oder Millisekunden (1000) zu erhalten
Zld Productions

es scheint, dass der Wert immer positiv ist, auch wenn a und b getauscht werden
Nickpick

@Nickpick der Wert ist nicht immer positiv. Beispiel ist das folgende -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo

Beeindruckende Lösung! Für die Erstellung von Funktionen ist kein sauberer Code erforderlich.
Paulo zOiO zuLLu Fabrício

34
import time  
current = time.time()

...job...
end = time.time()
diff = end - current

würde das für dich funktionieren?


1
+1; Das Datum beider Aufrufe ist uns eigentlich egal - wir kümmern uns um die verstrichene Zeit. Verwenden Sie also einfach einen rohen Zeitstempel, wie gezeigt.
Karl Knechtel

14
>>> from datetime import datetime

>>>  a = datetime.now()

# wait a bit 
>>> b = datetime.now()

>>> d = b - a # yields a timedelta object
>>> d.seconds
7

(7 ist die Zeit, die Sie oben gewartet haben)

Ich finde datetime.datetime ziemlich nützlich. Wenn Sie also auf ein kompliziertes oder unangenehmes Szenario gestoßen sind, lassen Sie es uns bitte wissen.

EDIT: Vielen Dank an @WoLpH für den Hinweis, dass man nicht immer so häufig nach Aktualisierungen suchen muss, dass die Datenzeiten nahe beieinander liegen. Durch die Berücksichtigung der Tage im Delta können Sie längere Zeitstempeldiskrepanzen behandeln:

>>> a = datetime(2010, 12, 5)
>>> b = datetime(2010, 12, 7)
>>> d = b - a
>>> d.seconds
0
>>> d.days
2
>>> d.seconds + d.days * 86400
172800

1
Wenn Sie d.seconds + d.days * 86400stattdessen zurückkehren, ist es für mehrere Tage korrekt;)
Wolph

7
Beachten Sie, dass dies im allgemeinen Fall nicht korrekt ist . Betrachten wir den Fall a - b, wo aist vor b (dh so das Ergebnis negativ sein wird): (a - b).seconds == 86282während a - b == datetime.timedelta(-1, 86276, 627665). Ich glaube, die richtige Methode ist, timedelta.total_seconds()... Aber das ist nur py2.7 +.
David Wolever

4
In der Tat ist die Antwort nicht richtig und sollte den @ DavidWolever-Kommentar widerspiegeln. Die richtige Antwort lautet: verwenden timedelta.total_seconds(). Dementsprechend herabgestimmt.
Astrojuanlu

3
Upvoted für Python 2.6 Antwort. total_seconds()ist eine Funktion ab 2.7.
Joe Holloway

@ JoeHolloway Ich denke, dass dies auch in Python 2.6 nicht richtig funktioniert.
Zen11625

12

Wir haben die Funktion total_seconds () mit Python 2.7. Siehe folgenden Code für Python 2.6

import datetime
import time  

def diffdates(d1, d2):
    #Date format: %Y-%m-%d %H:%M:%S
    return (time.mktime(time.strptime(d2,"%Y-%m-%d %H:%M:%S")) -
               time.mktime(time.strptime(d1, "%Y-%m-%d %H:%M:%S")))

d1 = datetime.now()
d2 = datetime.now() + timedelta(days=1)
diff = diffdates(d1, d2)

0

Hier ist der, der für mich arbeitet.

from datetime import datetime

date_format = "%H:%M:%S"

# You could also pass datetime.time object in this part and convert it to string.
time_start = str('09:00:00') 
time_end = str('18:00:00')

# Then get the difference here.    
diff = datetime.strptime(time_end, date_format) - datetime.strptime(time_start, date_format)

# Get the time in hours i.e. 9.60, 8.5
result = diff.seconds / 3600;

Hoffe das hilft!

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.