2009-08-28 7 views

Respuesta

204
>>> 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 
+2

Referencia: http://docs.python.org/library/datetime.html#datetime-objects. Lea "operaciones compatibles". –

+1

http://delorean.readthedocs.org/en/latest/ es genial para eso también – markcial

+0

@SilentGhost, Cómo obtener con horas, minutos, segundos – Mulagala

19

Simplemente reste uno del otro. Obtiene 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.

96

Nuevo en Python 2.7 es el método timedelta ejemplo .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 
+0

podría [use 'elapsedTime/timedelta (minutes = 1)' para obtener la diferencia en minutos en Python 3] (http://stackoverflow.com/a/26586909/4279) – jfs

6

Esto es cómo consigo el número de horas que transcurre entre dos objetos: datetime.datetime

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

Esto no funcionará del todo: 'timedelta .segundos' solo da la cantidad de segundos * almacenada explícitamente * - que la documentación garantiza totalizará menos de un día. Desea '(after - before) .total_seconds()', que da la cantidad de segundos que abarca el * entero * delta. – lvc

+1

'(after - before) .total_seconds() // 3600' (Python 2.7) o' (after - before) // timedelta (seconds = 3600) '(Python 3) – jfs

+0

@lvc Mi viejo código fue realmente escrito de esa manera , y pensé que estaba siendo inteligente y "lo solucioné". Gracias por la corrección. – Tony

14

Uso 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) 
+1

¿por qué se votó negativamente? – tgwaste

+1

Esto debe colocarse en el módulo de fecha y hora. Simplemente no puedo entender por qué usó solo días, segundos y milis ... – paulochf

+0

Esto no responde la pregunta con respecto a los objetos datetime. – elec3647

0

Este es mi enfoque usando 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 
+0

'mktime()' espera la hora local como entrada. La hora local puede ser ambigua y 'mktime()' puede devolver una respuesta incorrecta en este caso. [Use 'a - b' en su lugar (a, b - objetos de fecha y hora)] (http://stackoverflow.com/a/26586909/4279). 'mktime()' es innecesario y a veces es incorrecto. No lo use en este caso. – jfs

+0

quizás esto es py3? py27 esto no funcionó para mí. – AnneTheAgile

+0

@AnneTheAgile, corregido, mi culpa en la importación. Probado en Python 2.7.12 – Eduardo

14

Si a, b son objetos de fecha y hora después de encontrar la diferencia de tiempo entre ellos en Python 3:

from datetime import timedelta 

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

En anteriores versiones de Python:

time_difference_in_minutes = time_difference.total_seconds()/60 

Si a, b son objetos naive datetime como los devueltos por datetime.now(), entonces el resultado puede ser incorrecto si el representante de objetos resentir la hora local con diferentes desplazamientos UTC, por ejemplo, alrededor de las transiciones DST o para fechas pasadas/futuras. Más detalles: Find if 24 hrs have passed between datetimes - Python.

Para obtener resultados fiables, use objetos de fecha y hora u horario con reconocimiento de zona horaria.

4

Para encontrar el número de días: timedelta tiene el atributo 'días'. Simplemente puede 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 
2

Sólo pensé que podría ser útil mencionar el formato también en lo que respecta a timedelta. strptime() analiza una cadena que representa un tiempo de acuerdo con un formato.

import datetime 
from datetime import timedelta 

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

Esta es la salida: 0:05:00.518000

1

Usando ejemplo de fecha y hora

>>> 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) 
0

En Otras formas de obtener 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 obtenga la salida en mín.

Gracias

0

utilizo somethign así:

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 
Cuestiones relacionadas