2012-05-25 81 views
17

Necesito verificar si la hora actual está en rango de tiempo. El caso más sencillo TIME_END> TIME_START:¿Cómo comprobar si la hora actual está dentro del rango en python?

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

Pero los problemas comienzan cuando el usuario entra en un rango de tiempo cuando el tiempo final es menor que el tiempo de inicio, por ejemplo, "23:00 a 06:00" Un tiempo como '00: 00 'estará en este rango. Hace unos 5 años escribí esta función 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 < $tstart) 
     { 
     if ($tend - $tnow > 0 && $tnow > $tstart) 
      return true; 
     else if ($tnow - $tstart > 0 && $tnow > $tend) 
      return true; 
     else if ($tend > $tnow && $tend < $tstart && $tstart > $tnow) 
      return true; 
     else return false; 
     } else 
     { 
     if ($tstart < $tnow && $tend > $tnow) 
      return true; 
     else 
      return false; 
     } 

ahora tengo que hacer lo mismo, pero quiero que sea guapo. Entonces, ¿qué algoritmo debería usar para determinar si la hora actual '00: 00 'está en intervalo invertido, p. ['23:00', '01:00']?

+2

Cortar la OP cierta holgura, que tiene sólo el 27 rep. Bajar su pregunta sin decir por qué no lo educará. –

Respuesta

25

La solución de Python va a 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 

utilizar 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 
+0

si start = today [10:00], end = tomorrow [10:00], yx = 11:00 then 'start <= x <= end = False' !!! –

+0

@PauloScardine: debe elegir cómo interpretarlo: si [10:00, 10:00] tiene una duración de 0 o 24 horas. Cualquiera de las interpretaciones está bien. En otras palabras, dices que 'start

+0

Todo el concepto de comparar tiempos sin fechas es frágil si cruzas la barrera entre días. –

7

El concepto de datetime.time para mañana es nulo, porque datetime.time no puede representar esta información. Debe convertir todo para 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 

Cálculos con fecha/hora puede ser muy complicado, hay una enlightening video from the talk by Taavi Burns at PyCon2012 titulado "Lo que hay que saber sobre datetimes":

What you need to know about datetimes :
time, datetime y 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 le interesan.

Evento: PyCon de EE.UU. 2012/Altavoces: Taavi Burns/Grabado: March 10, 2012

Cuestiones relacionadas