¿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.

Steve Jay
fuente
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

fuente
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
Pär Wieslander
fuente
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
>>> 
Kimvais
fuente
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"
AndrewR
fuente
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.

Thomas Dignan
fuente
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
luc
fuente
1

Sorprendido no he visto este trazador de líneas aquí:

datetime.datetime.now().hour == 8
Jesse Reza Khorasanee
fuente
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

Aryan Vikash
fuente