2012-05-25 14 views
17

मुझे यह जांचने की ज़रूरत है कि वर्तमान समय टाइमरेंज में है या नहीं। सबसे सरल मामले time_end> TIME_START:कैसे जांचें कि वर्तमान समय पायथन में है या नहीं?

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

लेकिन मुसीबतों जब समाप्ति समय प्रारंभ समय से छोटा होता है जब उपयोगकर्ता एक समय सीमा में प्रवेश करती है, उदाहरण के लिए शुरू "23:00 - 06:00"। '00: 00 'जैसे समय इस सीमा में होंगे।

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

अब मैं एक ही बात करने की जरूरत है, लेकिन मैं इसे अच्छी लग रही बनाना चाहते: के बारे में 5 साल पहले मैं इस PHP समारोह लिखा था। तो, मुझे यह निर्धारित करने के लिए क्या एल्गोरिदम का उपयोग करना चाहिए कि वर्तमान समय '00: 00 ' रेंज को उलट देता है या नहीं। ['23:00', '01:00']?

+2

को कुछ ढीला ओपी कट, वह केवल 27 प्रतिनिधि है। बिना बताए अपने सवाल को कम करना क्यों उसे शिक्षित नहीं करेगा। –

उत्तर

25

पायथन समाधान बहुत छोटा, बहुत छोटा होगा।

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, और x के लिए datetime.time वर्ग का प्रयोग करें।

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

अगर शुरू = आज [10:00], अंत = कल [10:00], और x = 11:00 फिर 'प्रारंभ <= x <= end = झूठा ~ !!! –

+0

@PauloScardine: आपको यह चुनना है कि इसे कैसे समझना है: चाहे [10:00, 10:00] लंबाई 0 या 24 घंटे हो। या तो व्याख्या ठीक है। दूसरे शब्दों में, आप कहते हैं कि 'प्रारंभ

+0

यदि आप दिनों के बीच बाधा पार कर रहे हैं तो तारीखों के बिना समय की तुलना करने की पूरी अवधारणा नाजुक है। –

7

कल के लिए डेटाटाइम की समय अवधारणा शून्य है, क्योंकि डेटाटाइम। समय इस जानकारी का प्रतिनिधित्व नहीं कर सकता है। आप की तुलना करने से पहले datetime.datetime के लिए सब कुछ परिवर्तित करना चाहिए:

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 

दिनांक/समय को शामिल गणना बहुत मुश्किल हो सकता है, वहाँ है एक enlightening video from the talk by Taavi Burns at PyCon2012 जिसका शीर्षक था "आप datetimes के बारे में पता करने की जरूरत है":

What you need to know about datetimes :
time, datetime, और calendar मानक लाइब्रेरी से थोड़ा गन्दा है। पता लगाएं: कहां और कैसे उपयोग करें (विशेष रूप से जब आपके पास कई टाइमज़ोन में उपयोगकर्ता होते हैं), और आप कौन से अतिरिक्त मॉड्यूल देखना चाहते हैं।

घटना: PyCon अमेरिका 2012/वक्ताओं: तावी बर्न्स/ रिकार्ड: 10 मार्च, 2012

संबंधित मुद्दे