Converter timedelta em segundos totais

186

Eu tenho uma diferença horária

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

Agora, como encontro o número total de segundos que passaram? diff.secondsnão conta dias. Eu poderia fazer:

diff.seconds + diff.days * 24 * 3600

Existe um método interno para isso?

ripper234
fonte
8
@RestRisiko - você está certo. Ainda assim, é útil ter a pergunta no Stack Overflow, para que da próxima vez que eu, ou outra pessoa, pesquise no Google, ele tenha uma boa resposta como resultado principal.
precisa saber é o seguinte
Podemos discutir definições alternativas de "bom" posteriormente; leia minha resposta antes de fugir :)
John Machin
Existem vários problemas com a computação time1e diffno seu código. Para obter o tempo de utc atual como um objeto de data e hora ingênuo, use em seu datetime.utcnow()lugar. Para entender por que você deve usar o UTC em vez da hora local para encontrar a diferença, consulte Localizar se 24 horas se passaram entre as datas - Python . time.monotonic()pode ser preferível encontrar o tempo decorrido entre os eventos (em vez de time.time()ou datetime.utcnow()).
JFS

Respostas:

384

Use timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0
Andreas Jung
fonte
26
Novidade em python 2.7
Evgeny 06/06
7
Se alguém ainda precisar ser compatível com o 2.6: consulte stackoverflow.com/questions/3318348/… para saber como estender datetime.timedelta com o novo método.
Uwe Geuder
6
datetime.timedelta.total_seconds (time2-time1) em Python3.6
Russo
8

Você tem um problema de uma maneira ou de outra com sua datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))expressão.

(1) Se tudo o que você precisa é a diferença entre dois instantes em segundos, o mais simples time.time()é o trabalho.

(2) Se você estiver usando esses registros de data e hora para outros fins, precisará considerar o que está fazendo, porque o resultado tem um cheiro forte por todo o lado:

gmtime()retorna uma tupla de hora no UTC, mas mktime()espera uma tupla de hora na hora local.

Estou em Melbourne, na Austrália, onde o TZ padrão é UTC + 10, mas o horário de verão ainda está em vigor até amanhã de manhã, então é UTC + 11. Quando executei o seguinte, era 02-04-2011T20: 31, hora local aqui ... UTC era 2011-04-02T09: 31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

Você notará que t3, o resultado da sua expressão é UTC + 1, que parece ser UTC + (minha diferença local no horário de verão) ... não muito significativo. Você deve considerar o uso datetime.datetime.utcnow()que não salta uma hora quando o horário de verão é ligado / desligado e pode fornecer mais precisão do quetime.time()

John Machin
fonte
Obrigado pelo esclarecimento. Para o propósito que estou usando agora, uma diferença de algumas horas de vez em quando não é importante, mas vou verificar isso no futuro quando escrever algo mais significativo.
amigos estão dizendo sobre ripper234
-7

Você pode usar o módulo mx.DateTime

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
gopisubramni
fonte