¿Cómo verificar si la hora actual está dentro del rango en Python?

Necesito verificar si la hora actual está en el rango de tiempo. El caso más simple time_end> time_start:

if time(6,0) <= now.time() <= time(12,00): print '1' 

Pero los problemas comienzan cuando el usuario ingresa un rango de tiempo cuando la hora final es más pequeña que la hora de inicio, por ejemplo, “23:00 – 06:00”. Un tiempo como ’00: 00 ‘estará en este rango. Hace aproximadamente 5 años escribí esta función de PHP:

 function checkInterval($start, $end) { $dt = date("H:i:s"); $tstart = explode(":", $start); $tend = explode(":", $end); $tnow = explode(":", $dt); if (!$tstart[2]) $tstart[2] = 0; if (!$tend[2]) $tend[2] = 0; $tstart = $tstart[0]*60*60 + $tstart[1]*60 + $tstart[2]; $tend = $tend[0]*60*60 + $tend[1]*60 + $tend[2]; $tnow = $tnow[0]*60*60 + $tnow[1]*60 + $tnow[2]; if ($tend  0 && $tnow > $tstart) return true; else if ($tnow - $tstart > 0 && $tnow > $tend) return true; else if ($tend > $tnow && $tend  $tnow) return true; else return false; } else { if ($tstart  $tnow) return true; else return false; } 

Ahora necesito hacer lo mismo, pero quiero que sea atractivo. Entonces, ¿qué algoritmo debo usar para determinar si la hora actual ’00: 00 ‘está en el rango invertido , por ejemplo, ['23:00', '01:00'] ?

La solución de Python será mucho, mucho más corta.

 def time_in_range(start, end, x): """Return true if x is in the range [start, end]""" if start <= end: return start <= x <= end else: return start <= x or x <= end 

Use la clase datetime.time para start , end y x .

 >>> import datetime >>> start = datetime.time(23, 0, 0) >>> end = datetime.time(1, 0, 0) >>> time_in_range(start, end, datetime.time(23, 30, 0)) True >>> time_in_range(start, end, datetime.time(12, 30, 0)) False 

El concepto de datetime.time para mañana es nulo, porque datetime.time no puede representar esta información. Debería convertir todo a datetime.datetime antes de comparar:

 def time_in_range(start, end, x): today = datetime.date.today() start = datetime.datetime.combine(today, start) end = datetime.datetime.combine(today, end) x = datetime.datetime.combine(today, x) if end <= start: end += datetime.timedelta(1) # tomorrow! if x <= start x += datetime.timedelta(1) # tomorrow! return start <= x <= end 

Los cálculos que involucran la fecha y la hora pueden ser muy complicados, hay un video esclarecedor de la charla de Taavi Burns en PyCon2012 titulado "Lo que necesita saber sobre fechas de datos":

Lo que necesitas saber sobre fechas de datos :
time , la datetime y el calendar de la biblioteca estándar son un poco desordenados. Averigüe: qué usar dónde y cómo (especialmente cuando tiene usuarios en muchas zonas horarias) y qué módulos adicionales podría querer analizar.

Evento : PyCon US 2012 / Ponentes : Taavi Burns / Grabado : 10 de marzo de 2012