Convertir timedelta a segundos totales

186

Tengo una diferencia horaria

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

Ahora, ¿cómo encuentro el número total de segundos que pasaron? diff.secondsNo cuenta los días. Yo podría hacer:

diff.seconds + diff.days * 24 * 3600

¿Hay un método integrado para esto?

ripper234
fuente
8
@RestRisiko: tienes razón. Aún así, es útil tener la pregunta sobre Desbordamiento de pila, por lo que la próxima vez que yo o alguien más busque en Google, tiene una buena respuesta como resultado principal.
ripper234
Podemos discutir definiciones alternativas de "bueno" más adelante; por favor lea mi respuesta antes de huir :)
John Machin
Hay múltiples problemas con la informática time1y diffen su código. Para obtener el tiempo utc actual como un objeto datetime ingenuo, use datetime.utcnow()en su lugar. Para entender por qué debería usar UTC en lugar de la hora local para encontrar la diferencia, vea Buscar si han pasado 24 horas entre fechas y horas: Python . time.monotonic()podría ser preferible encontrar el tiempo transcurrido entre eventos (en lugar de time.time()o datetime.utcnow()).
jfs

Respuestas:

384

Uso timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0
Andreas Jung
fuente
26
Nuevo en python 2.7
Evgeny
77
Si alguien aún necesita ser compatible con 2.6: consulte stackoverflow.com/questions/3318348/… para saber cómo extender datetime.timedelta con el nuevo método usted mismo.
Uwe Geuder
66
datetime.timedelta.total_seconds (time2-time1) en Python3.6
Russo
8

Tienes un problema de una forma u otra con tu datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))expresión.

(1) Si todo lo que necesita es la diferencia entre dos instantes en segundos, lo muy simple time.time()hace el trabajo.

(2) Si está usando esas marcas de tiempo para otros fines, debe considerar lo que está haciendo, porque el resultado tiene un gran olor por todas partes:

gmtime()devuelve una tupla de tiempo en UTC pero mktime()espera una tupla de tiempo en hora local.

Estoy en Melbourne, Australia, donde la TZ estándar es UTC + 10, pero el horario de verano sigue vigente hasta mañana por la mañana, así que es UTC + 11. Cuando ejecuté lo siguiente, era 2011-04-02T20: 31 hora local aquí ... 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

Notarás que t3, el resultado de tu expresión es UTC + 1, que parece ser UTC + (mi diferencia local de DST) ... no muy significativo. Debería considerar usar el datetime.datetime.utcnow()que no saltará por una hora cuando el horario de verano se active / desactive y puede darle más precisión quetime.time()

John Machin
fuente
Gracias por la aclaración. Para el propósito que estoy usando en este momento, una diferencia de incluso unas pocas horas de vez en cuando no es importante, pero me aseguraré de comprobar esto en el futuro cuando escriba algo más significativo.
ripper234
-7

Puede usar el módulo mx.DateTime

import mx.DateTime as mt

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