Calcula la diferencia de tiempo usando python

Me pregunto si hay una forma o biblioteca integrada disponible para encontrar la diferencia en el tiempo a partir de dos entradas de cadena.

Lo que quiero decir es que, si tengo 2 cadenas de entrada:

  1. ‘2013-10-05T01: 21: 07Z’
  2. ‘2013-10-05T01: 21: 16Z’

¿Cómo puedo calcular la diferencia en el tiempo e imprimirla como salida?

Sé que suena un poco tonto, pero cualquier ayuda es apreciada.

Analizando tus cadenas usando strptime() :

 a = time.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ') b = time.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ') 

Esto analizará las cadenas de tiempo dadas como horas locales (configurando el horario de verano (horario de verano) en automático), y los resultados son estructuras de tiempo. Estos aún reflejan si el horario de verano estaba explícitamente desactivado (0), activado (1) o implícitamente automático (-1). Convierte estos a un flotador (segundos desde 1970-01-01):

 a = time.mktime(a) b = time.mktime(b) 

Luego calcula la diferencia (en segundos):

 d = b - a 

Y convertirlos a días / horas / minutos / segundos:

 days = int(d) / 86400 hours = int(d) / 3600 % 24 minutes = int(d) / 60 % 60 seconds = int(d) % 60 

El último bloque solo funciona correctamente para las diferencias positivas, así que tenga cuidado de no intercambiar los puntos a y b 😉

Pero @JFSebastian señaló correctamente que esto podría no ser lo que pretendías. De la notación parece que sus cadenas describen una hora UTC, no una hora local. Por meras diferencias de tiempo, esto es relevante en caso de que su tiempo se extienda sobre un interruptor DST. En este caso, por supuesto, resultaría en una diferencia de tiempo una hora demasiado grande o una hora demasiado pequeña (porque UTC siempre está sin DST).

Para evitar esto, puede establecer el indicador DST de automático (-1) a un valor fijo (por ejemplo, 0 para desactivado) y usar estos valores:

 a = time.mktime(a[:-1] + (0,)) # switch DST to off b = time.mktime(b[:-1] + (0,)) 

O, también como lo señaló @JFSebastian, podría olvidarse del módulo de time y, en su lugar, utilizar datetime.datetime que desconoce el aspecto de horario de verano:

 a = datetime.datetime.strptime('2013-10-05T01:21:07Z', '%Y-%m-%dT%H:%M:%SZ') b = datetime.datetime.strptime('2013-10-05T01:21:16Z', '%Y-%m-%dT%H:%M:%SZ') 

Luego, los resultados son objetos de datetime y datetime que se pueden restar directamente para obtener un objeto timedelta que representa la diferencia de tiempo que desee. La impresión resultará en algo como 0:00:05 que podría ser exactamente lo que está buscando.

Parece que estás utilizando un dateTime con formato ISO 8601. Este formato se utiliza en muchos lugares, incluido el formato de intercambio de GPS.

 [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm] 

Utilizando datetime:

 import datetime a = datetime.datetime.strptime("2013-10-05T01:21:07Z", "%Y-%m-%dT%H:%M:%SZ") b = datetime.datetime.strptime("2013-10-05T01:21:16Z", "%Y-%m-%dT%H:%M:%SZ") c = b - a print(c) 

Ventajas:

  • Integrado en la biblioteca estándar de Python
  • Interfaz orientada a objetos

Desventajas:

  • Necesidad de manejar manualmente otras representaciones válidas de ISO 8601 como ‘2013-10-05T01: 21: 16 + 00: 00’
  • Lanza una excepción para los segundos de salto, como ‘2012-06-30T23: 59: 60Z’

Usando python-dateutil:

 import dateutil.parser a = dateutil.parser.parse("2013-10-05T01:21:07Z") b = dateutil.parser.parse("2013-10-05T01:21:16Z") c = b - a print(c) 

Ventajas:

  • Maneja automáticamente el formato en cualquier momento.

Desventajas:

  • Necesita la biblioteca python-dateutil (instalar pip python-dateutil)
  • Lanza una excepción para los segundos de salto, como ‘2012-06-30T23: 59: 60Z’

Usando time.strptime y time.mktime como lo sugiere Alfe

Ventajas:

  • Integrado en la biblioteca estándar de Python
  • Puede analizar segundos de salto como ‘2012-06-30T23: 59: 60Z’

Desventajas:

  • Necesidad de manejar manualmente otras representaciones válidas de ISO 8601 como ‘2013-10-05T01: 21: 16 + 00: 00’
  • Pérdida de un segundo de salto entre ‘2012-06-30T23: 59: 60Z’ y ‘2012-07-01T00: 00: 00Z’ (inevitable sin saber cuándo ocurrirán los siguientes segundos de salto)
 import datetime a = datetime.datetime.now() b = datetime.datetime.now() c = b - a datetime.timedelta(0, 8, 562000) divmod(c.days * 86400 + c.seconds, 60) 

Respuesta original aquí