2010-12-06 20 views
102

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, verificarlos con la marca de tiempo actual y actualizarlos según sea necesario.¿Cómo verifico la diferencia, en segundos, entre dos fechas?

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?

Respuesta

298

si desea calcular las diferencias entre dos fechas conocidas, utilizar total_seconds así:

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 
+41

La 'nota' es la parte más importante que las personas extrañan. Desearía poder dar otra votación al respecto. – Dexter

+0

Hay momentos en los que noto que da un resultado aparentemente ... incorrecto. 59.800 segundos para una diferencia de fracción de segundo. Por lo tanto, para operaciones más pequeñas, como diferencia de segundos, milisegundos o microsegundos, se podría usar '(ba) .microseconds' y luego dividir eso para obtener los segundos (1000000) o milisegundos (1000) –

+0

aparece el valor siempre es positivo, incluso cuando a y b se intercambian – Nickpick

24
import time 
current = time.time() 

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

¿funcionaría para usted?

+1

+1; en realidad, no nos importa la fecha de invocación, nos preocupa el tiempo transcurrido. Entonces use una marca de tiempo sin formato, como se muestra. –

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 habrá cualquier cantidad de tiempo que esperó un poco más arriba)

encuentro datetime.datetime a ser bastante útil, por lo que si hay un escenario complicado o difícil de manejar que le ha surgido, por favor Haznos saber.

EDITAR: Gracias a @WoLpH por señalar que uno no siempre está buscando actualizar con tanta frecuencia que los tiempos de las fechas estarán juntos. Al tener en cuenta los días en el delta, que puede manejar las discrepancias ya marca de tiempo:

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

Si devuelve 'd.seconds + d.days * 86400' en su lugar, es correcto durante varios días;) – Wolph

+5

Tenga en cuenta que, en el caso general, esto * no es correcto *. Considere el caso 'a - b', donde' a' es * antes * 'b' (es decir, el resultado será negativo):' (a - b) .seconds == 86282' mientras 'a - b == datetime.timedelta (-1, 86276, 627665) '. El método correcto, creo, es usar 'timedelta.total_seconds()' ... Pero eso es solo py2.7 +. –

+2

De hecho, la respuesta no es correcta y debería reflejar el comentario de @DavidWolever. La respuesta correcta es: use 'timedelta.total_seconds()'. Downvoted en consecuencia. – astrojuanlu

8

Tenemos la función total_sec onds() con Python 2.7 favor ver más abajo código para el pitón 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 
Cuestiones relacionadas