¿Cómo comparar tiempos en Python?


99

Veo que se pueden hacer comparaciones de fechas y también las hay datetime.timedelta(), pero estoy luchando por averiguar cómo verificar si la hora actual ( datetime.datetime.now()) es anterior, posterior o igual a una hora específica (por ejemplo, 8 am) independientemente de la fecha.


1
No estoy seguro de poner esto como respuesta, pero lo puse aquí como comentario: sorprendentemente, descubrí que Python acepta comparaciones como '23:23:00' > '23:59:00'o '23:23:00' > '23:09:22', tal como lo haría entre dos datetime.datetime.now().strftime('%H:%M')valores. ¿Es la mejor forma de lograr la comparación entre tiempos? No lo sé. ¿Funciona? Por lo que probé, funcionó bien. Pero definitivamente (y por supuesto): no hay posibilidad de usar esto con una cadena de fecha y hora que tenga meses, días de la semana.
ivanleoncz

Respuestas:


129

No se puede comparar un momento específico en el tiempo (como "ahora mismo") con un evento recurrente no fijo (a las 8 a. M. Ocurre todos los días).

Puede comprobar si ahora es antes o después de las 8 a. M. De hoy :

>>> import datetime
>>> now = datetime.datetime.now()
>>> today8am = now.replace(hour=8, minute=0, second=0, microsecond=0)
>>> now < today8am
True
>>> now == today8am
False
>>> now > today8am
False

4
Es posible que desee cambiar la aceptación a la respuesta de Pär Wieslander (y, en general, debería esperar unos minutos más que lo que hizo: P), ya que es un poco más específico para exactamente lo que preguntó.

65

Puede usar el time()método de datetimeobjetos para obtener la hora del día, que puede usar para comparar sin tener en cuenta la fecha:

>>> this_morning = datetime.datetime(2009, 12, 2, 9, 30)
>>> last_night = datetime.datetime(2009, 12, 1, 20, 0)
>>> this_morning.time() < last_night.time()
True

2
¡Asegúrese de hacerlo datetime.datetime.now().time(), no olvide los corchetes now()!
Jose Salvatierra

10

Puede comparar los objetos datetime.datetime directamente

P.ej:

>>> a
datetime.datetime(2009, 12, 2, 10, 24, 34, 198130)
>>> b
datetime.datetime(2009, 12, 2, 10, 24, 36, 910128)
>>> a < b
True
>>> a > b
False
>>> a == a
True
>>> b == b
True
>>> 

4

Inspirado por Roger Pate:

import datetime
def todayAt (hr, min=0, sec=0, micros=0):
   now = datetime.datetime.now()
   return now.replace(hour=hr, minute=min, second=sec, microsecond=micros)    

# Usage demo1:
print todayAt (17), todayAt (17, 15)

# Usage demo2:    
timeNow = datetime.datetime.now()
if timeNow < todayAt (13):
   print "Too Early"

2

Otra forma de hacer esto sin agregar dependencias o usar datetime es simplemente hacer algunos cálculos matemáticos sobre los atributos del objeto time. Tiene horas, minutos, segundos, milisegundos y una zona horaria. Para comparaciones muy simples, las horas y los minutos deberían ser suficientes.

d = datetime.utcnow()
t = d.time()
print t.hour,t.minute,t.second

No recomiendo hacer esto a menos que tenga un caso de uso increíblemente simple. Para cualquier cosa que requiera conocimiento de la zona horaria o conocimiento de las fechas, debe usar datetime.


1

datetime tiene capacidad de comparación

>>> import datetime
>>> import time
>>> a =  datetime.datetime.now()
>>> time.sleep(2.0)
>>> b =  datetime.datetime.now()
>>> print a < b
True
>>> print a == b
False


1

Puede utilizar la función Timedelta para comparar aumentos de tiempo x.

>>> import datetime 

>>> now = datetime.datetime.now()
>>> after_10_min = now + datetime.timedelta(minutes = 10)
>>> now > after_10_min 

False

Solo una combinación de estas respuestas this And Roger

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.