¿Cómo verifico la diferencia, en segundos, entre dos fechas?

180

Tiene que haber una manera más fácil de hacer esto. Tengo objetos que desean actualizarse de vez en cuando, por lo que quiero registrar cuándo se crearon, comparar con la marca de tiempo actual y actualizar según sea necesario.

datetime.datetime ha demostrado ser difícil, y no quiero sumergirme en la biblioteca ctime. ¿Hay algo más fácil para este tipo de cosas?

Alex
fuente

Respuestas:

516

si desea calcular las diferencias entre dos fechas conocidas, use total_secondsasí:

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 0

Rich Signell
fuente
95
La 'nota' es la parte más importante que la gente extraña. Desearía poder darle otro voto al respecto.
Dexter
Hay momentos en que noto que da un resultado aparentemente ... incorrecto. 59.800 segundos por una fracción de segundo de diferencia. Entonces, para operaciones más pequeñas, como la diferencia de segundos, milisegundos o microsegundos, uno podría usar (b-a).microsecondsy luego dividir eso para obtener los segundos (1000000) o milisegundos (1000)
Zld Productions
parece que el valor siempre es positivo, incluso cuando se intercambian
ayb
@Nickpick el valor no siempre es positivo. por ejemplo, lo siguiente es -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo
¡Impresionante solución! El código limpio no es necesario para crear funciones.
Paulo zOiO zuLLu Fabrício
36
import time  
current = time.time()

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

¿Eso funcionaría para ti?

Matcheek
fuente
1
+1; Realmente no nos importa la fecha de invocación, nos importa el tiempo transcurrido. Tan solo use una marca de tiempo sin procesar, como se muestra.
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 será la cantidad de tiempo que haya esperado un poco más arriba)

Considero que datetime.datetime es bastante útil, por lo que si hay un escenario complicado o incómodo que haya encontrado, háganoslo saber.

EDITAR: Gracias a @WoLpH por señalar que no siempre se busca necesariamente actualizar con tanta frecuencia que las fechas y fechas estarán muy juntas. Al contabilizar los días en el delta, puede manejar discrepancias de marca de tiempo más largas:

>>> 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
Jarret Hardie
fuente
1
Si regresas d.seconds + d.days * 86400, es correcto por varios días;)
Wolph
77
Tenga en cuenta que, en el caso general, esto no es correcto . Considere el caso a - b, donde aestá antes b (es decir, el resultado será negativo): (a - b).seconds == 86282while a - b == datetime.timedelta(-1, 86276, 627665). El método correcto, creo, es usar timedelta.total_seconds()... Pero eso es solo py2.7 +.
David Wolever
44
De hecho, la respuesta no es correcta y debe reflejar el comentario de @DavidWolever. La respuesta correcta es: uso timedelta.total_seconds(). Voto en contra en consecuencia.
astrojuanlu
3
Votó a favor de Python 2.6 respuesta. total_seconds()es una característica 2.7+.
Joe Holloway
@JoeHolloway Supongo que esto tampoco funciona correctamente en Python 2.6.
zen11625
12

Tenemos la función total_seconds () con Python 2.7. Consulte el siguiente código para 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)
pygaur
fuente
0

Aquí está el que me está funcionando.

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;

¡Espero que esto ayude!

por lo tanto
fuente