¿Cómo encuentro la diferencia horaria entre dos objetos de fecha y hora en python?

¿Cómo puedo saber la diferencia de tiempo en minutos entre dos objetos de datetime ?

 >>> 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) (0, 8) # 0 minutes, 8 seconds 

Lo nuevo en Python 2.7 es el método de instancia de .total_seconds() . De los documentos de Python, esto es equivalente a (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 .

Referencia: http://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds

 >>> import datetime >>> time1 = datetime.datetime.now() >>> time2 = datetime.datetime.now() # waited a few minutes before pressing enter >>> elapsedTime = time2 - time1 >>> elapsedTime datetime.timedelta(0, 125, 749430) >>> divmod(elapsedTime.total_seconds(), 60) (2.0, 5.749430000000004) # divmod returns quotient and remainder # 2 minutes, 5.74943 seconds 

Solo resta una de la otra. timedelta un objeto timedelta con la diferencia.

 >>> import datetime >>> d1 = datetime.datetime.now() >>> d2 = datetime.datetime.now() # after a 5-second or so pause >>> d2 - d1 datetime.timedelta(0, 5, 203000) 

Puede convertir dd.days , dd.seconds y dd.microseconds a minutos.

Usando el ejemplo de datetime

 >>> from datetime import datetime >>> then = datetime(2012, 3, 5, 23, 8, 15) # Random date in the past >>> now = datetime.now() # Now >>> duration = now - then # For build-in functions >>> duration_in_s = duration.total_seconds() # Total number of seconds between dates 

Duración en años

 >>> years = divmod(duration_in_s, 31556926)[0] # Seconds in a year=31556926. 

Duración en días

 >>> days = duration.days # Build-in datetime function >>> days = divmod(duration_in_s, 86400)[0] # Seconds in a day = 86400 

Duración en horas

 >>> hours = divmod(duration_in_s, 3600)[0] # Seconds in an hour = 3600 

Duración en minutos

 >>> minutes = divmod(duration_in_s, 60)[0] # Seconds in a minute = 60 

Duración en segundos

 >>> seconds = duration.seconds # Build-in datetime function >>> seconds = duration_in_s 

Duración en microsegundos.

 >>> microseconds = duration.microseconds # Build-in datetime function 

Duración total entre las dos fechas.

 >>> days = divmod(duration_in_s, 86400) # Get days (without [0]!) >>> hours = divmod(days[1], 3600) # Use remainder of days to calc hours >>> minutes = divmod(hours[1], 60) # Use remainder of hours to calc minutes >>> seconds = divmod(minutes[1], 1) # Use remainder of minutes to calc seconds >>> print("Time between dates: %d days, %d hours, %d minutes and %d seconds" % (days[0], hours[0], minutes[0], seconds[0])) 

o simplemente:

 >>> print(now - then) 

Si a , b son objetos de fecha y hora para encontrar la diferencia horaria entre ellos en Python 3:

 from datetime import timedelta time_difference = a - b time_difference_in_minutes = time_difference / timedelta(minutes=1) 

En versiones anteriores de Python:

 time_difference_in_minutes = time_difference.total_seconds() / 60 

Si a , b son objetos de fecha y hora ingenuos, como los devueltos por datetime.now() , el resultado puede ser incorrecto si los objetos representan la hora local con diferentes compensaciones UTC, por ejemplo, alrededor de transiciones DST o para fechas pasadas / futuras. Más detalles: Encuentre si han transcurrido 24 horas entre los tiempos de las fechas: Python .

Para obtener resultados confiables, use objetos de fecha y hora UTC o de fecha y hora que tengan en cuenta la zona horaria.

Utilice divmod:

 now = int(time.time()) # epoch seconds then = now - 90000 # some time in the past d = divmod(now-then,86400) # days h = divmod(d[1],3600) # hours m = divmod(h[1],60) # minutes s = m[1] # seconds print '%d days, %d hours, %d minutes, %d seconds' % (d[0],h[0],m[0],s) 

Así es como obtengo la cantidad de horas que transcurrieron entre dos objetos datetime.datetime:

 before = datetime.datetime.now() after = datetime.datetime.now() hours = math.floor(((after - before).seconds) / 3600) 

Solo para encontrar el número de días: timedelta tiene un atributo de “días”. Usted puede simplemente consultar eso.

 >>>from datetime import datetime, timedelta >>>d1 = datetime(2015, 9, 12, 13, 9, 45) >>>d2 = datetime(2015, 8, 29, 21, 10, 12) >>>d3 = d1- d2 >>>print d3 13 days, 15:59:33 >>>print d3.days 13 

Pensé que podría ser útil mencionar el formato también en lo que respecta a timedelta. strptime () analiza una cadena que representa una hora según un formato.

 from datetime import datetime datetimeFormat = '%Y/%m/%d %H:%M:%S.%f' time1 = '2016/03/16 10:01:28.585' time2 = '2016/03/16 09:56:28.067' time_dif = datetime.strptime(time1, datetimeFormat) - datetime.strptime(time2,datetimeFormat) print(time_dif) 

Esto dará salida: 0: 05: 00.518000

Yo uso algo así como esto:

 from datetime import datetime def check_time_difference(t1: datetime, t2: datetime): t1_date = datetime( t1.year, t1.month, t1.day, t1.hour, t1.minute, t1.second) t2_date = datetime( t2.year, t2.month, t2.day, t2.hour, t2.minute, t2.second) t_elapsed = t1_date - t2_date return t_elapsed # usage f = "%Y-%m-%d %H:%M:%S+01:00" t1 = datetime.strptime("2018-03-07 22:56:57+01:00", f) t2 = datetime.strptime("2018-03-07 22:48:05+01:00", f) elapsed_time = check_time_difference(t1, t2) print(elapsed_time) #return : 0:08:52 

Esto es para encontrar la diferencia entre la hora actual y las 9.30 am.

 t=datetime.now()-datetime.now().replace(hour=9,minute=30) 

Este es mi enfoque utilizando mktime .

 from datetime import datetime, timedelta from time import mktime yesterday = datetime.now() - timedelta(days=1) today = datetime.now() difference_in_seconds = abs(mktime(yesterday.timetuple()) - mktime(today.timetuple())) difference_in_minutes = difference_in_seconds / 60 

En otras formas de obtener la diferencia entre la fecha;

 import dateutil.parser import datetime last_sent_date = "" # date string timeDifference = current_date - dateutil.parser.parse(last_sent_date) time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60) 

Así que consigue la salida en min.

Gracias