2010-12-06 15 views
102

Es muss einen einfacheren Weg geben, dies zu tun. Ich habe Objekte, die immer wieder aktualisiert werden sollen, also möchte ich aufzeichnen, wann sie erstellt wurden, mit dem aktuellen Zeitstempel vergleichen und bei Bedarf aktualisieren.Wie überprüfe ich die Differenz in Sekunden zwischen zwei Daten?

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

Antwort

298

, wenn Sie Unterschiede zwischen zwei bekannten Daten zu berechnen, verwenden Sie total_seconds wie folgt aus:

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

+41

Die "Note" ist der wichtigste Teil, den die Leute verpassen. Ich wünschte, ich könnte erneut darüber abstimmen. – Dexter

+0

Es gibt Zeiten, in denen ich bemerke, dass es ein scheinbar ... falsches Ergebnis gibt. 59.800 Sekunden für einen Sekundenbruchteil Unterschied. Also, für kleinere Operationen, wie die Differenz von Sekunden, Millisekunden oder Mikrosekunden, könnte man '(ba) .microseconds' und dann teilen, um die Sekunden (1000000) oder Millisekunden (1000) –

+0

es erscheint der Wert ist immer positiv, auch wenn a und b vertauscht sind – Nickpick

24
import time 
current = time.time() 

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

würde das für Sie arbeiten?

+1

+1; Das Datum der beiden Aufrufe interessiert uns nicht wirklich - wir kümmern uns um die verstrichene Zeit. Benutzen Sie einfach einen rohen Zeitstempel, wie gezeigt. –

12
>>> from datetime import datetime 

>>> a = datetime.now() 

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

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

(7 werden, was viel Zeit Sie ein wenig über wartete)

I datetime.datetime finden ziemlich nützlich sein, so dass, wenn es eine komplizierte oder umständlich ist Szenario, das Sie je gesehen habe, bitte Lass uns wissen.

EDIT: Danke an @WoLpH für den Hinweis, dass man sich nicht immer so oft auffrischen muss, dass die Datumsangaben dicht beieinander liegen. Durch Berücksichtigung für die Tage im Delta, können Sie längere Zeitstempel Abweichungen handhaben:

>>> 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 * 86400' stattdessen zurückgeben, ist es für mehrere Tage korrekt;) – Wolph

+5

Beachten Sie, dass dies im allgemeinen Fall * nicht korrekt ist *. Betrachte den Fall 'a - b', wobei 'a' * vor * 'b' ist (dh, das Ergebnis ist also negativ): '(a - b) .seconds == 86282' während 'a - b == datetime.timedelta (-1, 86276, 627665) '. Die korrekte Methode, glaube ich, ist die Verwendung von 'timedelta.total_seconds()' ... Aber das ist nur py2.7 +. –

+2

In der Tat ist die Antwort nicht richtig und sollte @DavidWolever Kommentar reflektieren. Die richtige Antwort ist: benutze 'timedelta.total_seconds()'. Nach unten abgestimmt. – astrojuanlu

8

Wir haben Funktion total_sec onds() mit Python 2.7 unten Code Bitte beachten Sie 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) 
-2
>>> import datetime 

>>> d1 = datetime.datetime.now() 

>>> d2 = datetime.datetime.now() 

>>> d=d2 - d1 

>>> d.seconds 
Verwandte Themen