2012-05-25 9 views
17

Muszę sprawdzić, czy aktualny czas jest w module czasowym. Najbardziej prosta sprawa time_end> TIME_START:Jak sprawdzić, czy aktualny czas jest w zakresie w python?

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

Ale kłopoty zaczynają się, gdy użytkownik wchodzi w zakres czasu, kiedy czas końcowy jest mniejszy niż czas rozpoczęcia, na przykład "23:00 - 06:00". Czas taki jak "00: 00" będzie w tym zakresie. Około 5 lat temu pisałem tę funkcję 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; 
     } 

teraz muszę zrobić to samo, ale chcę zrobić to dobrze wygląda. A więc jaki algorytm powinienem użyć, aby określić, czy aktualny czas '00: 00 'jest w zakresie od odwrócony zakresu np. ['23:00', '01:00']?

+2

Pokrój OP trochę luzu, on ma tylko 27 rep. Zanotowano jego pytanie, nie mówiąc, dlaczego go nie kształci. –

Odpowiedz

25

Rozwiązanie Python będzie znacznie, znacznie krócej.

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 

Użyj klasę datetime.time dla start, end i 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

jeśli start = dzisiaj [10:00], koniec = jutro [10:00], a x = 11:00 to "początek <= x <= koniec = fałsz' !!! –

+0

@PauloScardine: Musisz wybrać sposób interpretacji: czy [10:00, 10:00] ma długość 0 lub 24 godziny. Każda interpretacja jest w porządku. Innymi słowy, mówisz, że 'start

+0

Cała koncepcja porównywania czasów bez dat jest delikatna, jeśli przekraczasz barierę między dniami. –

7

Pojęcie datetime.time na jutro jest nieważna, ponieważ datetime.time nie może reprezentować tej informacji. należy przekonwertować wszystko datetime.datetime przed porównaniem:

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 

Obliczenia obejmujące datę/czas może być bardzo trudne, istnieje enlightening video from the talk by Taavi Burns at PyCon2012 zatytułowany „Co trzeba wiedzieć o datetimes”:

What you need to know about datetimes :
time, datetime i calendar ze standardowej biblioteki są nieco niechlujne. Dowiedz się, co używać w miejscu i czasie (szczególnie gdy masz użytkowników w wielu strefach czasowych) i jakie dodatkowe moduły możesz chcieć sprawdzić.

Event: PyCon US 2012/Głośniki: Taavi Burns/Recorded: 10 marca 2012

Powiązane problemy