Come posso verificare la differenza, in secondi, tra due date?


180

Deve esserci un modo più semplice per farlo. Ho oggetti che vogliono essere aggiornati di tanto in tanto, quindi voglio registrare quando sono stati creati, verificare con il timestamp corrente e aggiornare se necessario.

datetime.datetime ha dimostrato di essere difficile e non voglio immergermi nella libreria di ctime. C'è qualcosa di più facile per questo genere di cose?

Risposte:


516

se si desidera calcolare le differenze tra due date conosciute, utilizzare in total_secondsquesto modo:

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()

86.400,0

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

0


95
La "nota" è la parte più importante che manca alla gente. Vorrei poter dare un altro voto in proposito.
Dexter,

Ci sono momenti in cui noto che dà un risultato apparentemente ... errato. 59.800 secondi per una differenza di frazione di secondo. Quindi, per operazioni più piccole, come la differenza di secondi, millisecondi o microsecondi, si potrebbe usare (b-a).microsecondse poi dividerlo per ottenere i secondi (1000000) o i millisecondi (1000)
Zld Productions,

sembra che il valore sia sempre positivo, anche quando a e b vengono scambiati
Nickpick

@Nickpick il valore non è sempre positivo. ad esempio il seguente è -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo

Soluzione impressionante! Il codice pulito non è necessario per creare funzioni.
Paulo zOiO zuLLu Fabrício

36
import time  
current = time.time()

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

questo funzionerebbe per te?


1
+1; non ci interessa davvero la data di nessuna delle due invocazioni - ci preoccupiamo per il tempo trascorso. Quindi basta usare un timestamp grezzo, come mostrato.
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 sarà il tempo che hai aspettato un po 'sopra)

Trovo che datetime.datetime sia abbastanza utile, quindi se c'è uno scenario complicato o imbarazzante che hai incontrato, faccelo sapere.

EDIT: Grazie a @WoLpH per aver sottolineato che non si è sempre necessariamente alla ricerca di un aggiornamento così frequente che i tempi dei dati si avvicinino. Tenendo conto dei giorni nel delta, è possibile gestire discrepanze di data / ora più lunghe:

>>> 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
Se ritorni d.seconds + d.days * 86400invece, è corretto per più giorni;)
Wolph

7
Si noti che, nel caso generale, questo non è corretto . Considera il caso a - b, dove aè prima b (cioè, quindi il risultato sarà negativo): (a - b).seconds == 86282while a - b == datetime.timedelta(-1, 86276, 627665). Il metodo corretto, credo, è usare timedelta.total_seconds()... Ma questo è solo py2.7 +.
David Wolever,

4
In effetti, la risposta non è giusta e dovrebbe riflettere il commento di @DavidWolever. La risposta corretta è: usare timedelta.total_seconds(). Downvoted di conseguenza.
astrojuanlu,

3
Eseguito l'upgrade per la risposta Python 2.6. total_seconds()è una funzione 2.7+.
Joe Holloway,

@JoeHolloway Immagino che questo non funzioni correttamente anche in Python 2.6.
zen11625,

12

Abbiamo la funzione total_seconds () con Python 2.7 Vedi il codice sotto per 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

Ecco quello che sta funzionando per me.

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;

Spero che questo ti aiuti!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.