Como verifico a diferença, em segundos, entre duas datas?

180

Tem que haver uma maneira mais fácil de fazer isso. Eu tenho objetos que desejam ser atualizados de vez em quando, portanto, quero gravar quando eles foram criados, verificar o carimbo de data / hora atual e atualizar conforme necessário.

datetime.datetime provou ser difícil e não quero mergulhar na biblioteca ctime. Existe algo mais fácil para esse tipo de coisa?

Alex
fonte

Respostas:

516

se você quiser calcular diferenças entre duas datas conhecidas, use o total_secondsseguinte:

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
fonte
95
A `nota 'é a parte mais importante da qual as pessoas sentem falta. Eu gostaria de poder dar outro voto sobre isso.
Dexter
Há momentos em que percebo que isso dá um resultado aparentemente ... incorreto. 59.800 segundos para uma diferença de fração de segundo. Assim, para operações menores, como a diferença de segundos, milissegundos, ou microssegundos, pode-se usar (b-a).microsecondse, em seguida, dividir esse para obter os segundos (1000000) ou milissegundos (1000)
Zld Productions
parece que o valor é sempre positivo, mesmo quando a e b são trocados
Nickpick
@Nickpick o valor nem sempre é positivo. por exemplo, o seguinte é -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo 2/19/19
Solução impressionante! Não é necessário código limpo para criar funções.
Paulo zOiO zuLLu Fabrício 29/03/19
36
import time  
current = time.time()

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

isso funcionaria para você?

matcheek
fonte
1
+1; nós realmente não nos importamos com a data de qualquer invocação - nos importamos com o tempo decorrido. Portanto, basta usar um timestamp bruto, como mostrado.
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á a quantidade de tempo que você esperou um pouco acima)

Acho que datetime.datetime é bastante útil; portanto, se você encontrou um cenário complicado ou estranho, informe-nos.

EDIT: Agradecemos a @WoLpH por apontar que nem sempre é necessário atualizar com tanta frequência que as datas estão próximas. Ao contabilizar os dias no delta, você pode lidar com discrepâncias de carimbo de data / hora mais longas:

>>> 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
fonte
1
Se você retornar d.seconds + d.days * 86400, ele estará correto por vários dias;)
Wolph
7
Observe que, no caso geral, isso não está correto . Considere o caso a - b, onde aestá antes b (ou seja, o resultado será negativo): (a - b).seconds == 86282while a - b == datetime.timedelta(-1, 86276, 627665). O método correto, acredito, é usar timedelta.total_seconds()... Mas isso é apenas py2.7 +.
David Wolever
4
De fato, a resposta não está correta e deve refletir o comentário do @DavidWolever. A resposta correta é: use timedelta.total_seconds(). Votado em conformidade.
astrojuanlu
3
Promovido para Python 2.6 resposta. total_seconds()é um recurso 2.7+.
Joe Holloway
@JoeHolloway Acho que isso também não está funcionando corretamente no Python 2.6.
precisa saber é o seguinte
12

Temos a função total_seconds () com Python 2.7. Veja abaixo o 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
fonte
0

Aqui está o que está funcionando para mim.

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 isto ajude!

therealadrain
fonte