Python – Comparación de fecha y hora con marcas de tiempo, timedelta

He pasado la última hora explorando los documentos de Python y muchas preguntas de SO; por favor, perdóname por ser otro novato de Python atrapado por el misterio de la diferencia horaria en Python.

Mi objective es determinar la diferencia entre la hora actual y una fecha / hora determinada, independientemente de estar en el pasado / futuro y devolver un formato viable, como segundos.

Por ejemplo, si las entradas son 2:00 PM y 4:00 PM (ahora), me gustaría que dijera “-7200”, que representa el evento ocurrido dos horas antes. Si las entradas son Fri 4:00 PM (ahora) y Sun 5:00 PM, la salida debe ser de “176400” segundos, lo que representa dos días y 1 hora a partir de ahora.

Aquí están las cosas que he intentado …

Este es mi código actual (aún debe ser corregido para una comparación ‘bidireccional’), a partir de una pregunta de SO previamente resuelta:

now = time.strftime("%a %b %d %H:%M:%S %Y") then = time.ctime(os.path.getmtime("x.cache")) tdelta = datetime.strptime(now, '%a %b %d %H:%M:%S %Y') - datetime.strptime(then, '%a %b %d %H:%M:%S %Y') 

Y siento que debería poder, de alguna manera, sacar segundos de esto, como en esta pregunta: timedelta de Python: ¿no puedo entrar en la unidad de tiempo en la que quiero el valor de toda la diferencia?

Pero no sé cómo conectar estos puntos.

¿Cómo puedo lograr esto?

Debes ser capaz de usar

 tdelta.total_seconds() 

para obtener el valor que busca. Esto se debe a que tdelta es un objeto timedelta , al igual que cualquier diferencia entre los objetos de datetime .

Un par de notas:

  1. El uso de strftime seguido de strptime es superfluo. Debería poder obtener el datetime actual con datetime.now .
  2. De manera similar, usar time.ctime seguido de strptime es más trabajo del necesario. Debería poder obtener el otro objeto datetime.fromtimestamp con datetime.fromtimestamp .

Entonces, tu código final podría ser

 now = datetime.now() then = datetime.fromtimestamp(os.path.getmtime("x.cache")) tdelta = now - then seconds = tdelta.total_seconds() 

¿Qué hay de malo con este método?

 >>> from datetime import datetime >>> a = datetime.now() >>> b = datetime.now() # after a few seconds >>> delta = ab >>> delta.total_seconds() -6.655989 

Tenga en cuenta que total_seconds solo está disponible en Python 2.7 <, pero según la documentación es:

Equivalente a ( td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 computados con la división verdadera habilitada.

que da exactamente el mismo resultado.

Tuve el mismo problema hace un par de meses. Lo que está buscando es datetime.timedelta y datetime.datetime.fromtimestamp (). Aquí hay un ejemplo de cómo usarlos para solucionar su problema.

 import datetime import time t1 = time.time() #do something to kill time or get t2 from somewhere a = [i for i in range(1000)] t2 = time.time() #get the difference as datetime.timedelta object diff=(datetime.datetime.fromtimestamp(t1) - datetime.datetime.fromtimestamp(t2)) #diff is negative as t2 is in the future compared to t2 print('difference is {0} seconds'.format(abs(diff.total_seconds())))