2012-05-25 17 views
17

Geçerli saatin zaman dilimi içinde olup olmadığını kontrol etmem gerekiyor. En basit durumda TIME_END> TIME_START:Geçerli saat python'da menzil içinde mi kontrol edilir?

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

Ama sıkıntılar bitiş zamanı, başlangıç ​​zamanından küçük olduğunda kullanıcı örneğin bir zaman aralığı girdiğinde başlar "23:00 - 06:00" Bu aralıkta '00: 00 'gibi bir zaman olacak.

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; 
     } 

Şimdi aynı şeyi yapmak gerekir, ama iyi görünümlü yapmak istiyorum: Yaklaşık 5 yıl önce bu PHP fonksiyonu yazdım. Yani, şu anki saat '00: 00' aralığını tersine çevirmek için hangi algoritmayı kullanmalıyım? ['23:00', '01:00']?

+2

o sadece 27 ünü var, bazı gevşek OP kesin. Sorusunu reddetmeden onu neden eğitmeyeceğini söylüyorum. –

cevap

25

Python çözümü çok daha kısa olacak.

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 

start, end ve x için datetime.time sınıfını kullanın.

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

eğer start = bugün [10:00], bitiş = yarın [10:00] ve x = 11:00 sonra 'start <= x <= end = False' !!! –

+0

@PauloScardine: Nasıl yorumlanacağını seçmelisiniz: [10:00, 10:00], 0 veya 24 saat uzunluğunda. Ya yorumlama iyidir. Başka bir deyişle, “başla” dediniz, ama ben “başlangıç ​​<= son” u seçtim ve birini veya diğerini seçmek için açık bir sebep yok. –

+0

Günler arası bariyeri geçiyorsanız, tarihsiz zamanların karşılaştırılması kavramı kırılgandır. –

7

datetime.time, bu bilgiyi temsil edemediğinden, yarın için bir datetime.time kavramı geçersizdir. Sen karşılaştırarak önce datetime.datetime için her şeyi dönüştürmek olmalıdır: tarih/saat içeren

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 

Hesaplamalar çok yanıltıcı olabilir, "Eğer tarihsaat hakkında bilmeniz gerekenler" başlıklı bir enlightening video from the talk by Taavi Burns at PyCon2012 vardır:

What you need to know about datetimes Standart kitaplıktan
time, datetime ve calendar biraz dağınıktır. Öğrenin: Nerede ve nasıl kullanılır (özellikle birçok saat diliminde kullanıcılarınız varsa) ve hangi ek modüllere bakmak isteyebilirsiniz.

Olay: PyCon ABD 2012/Hoparlörler: Kaydedilmiş Taavi Burns/: 10 Mart 2012

İlgili konular