2013-06-17 11 views
5

Ho un sistema che accetta l'invio degli utenti, e dopo aver ricevuto una richiesta il sistema passerà attraverso tutte le finestre temporali per trovare il periodo temporale appropriato. Il problema è che deve essere in grado di controllare gli orari di inizio & se l'ora di fine termina il giorno successivo.Verifica se l'ora corrente è compresa tra due volte, con la possibilità di giorni di lappatura

Prendere l'esempio seguente: Una finestra temporale inizia alle 22:30 del giorno corrente e termina alle 16:00 del giorno successivo. Se l'ora corrente è tra le 22:30 e le 23:59:59 PM, l'invio verrà assegnato a quel periodo di applicazione. Tuttavia, se l'ora corrente è tra le 12:00 AM e le 4:00 PM, salterà il periodo di applicazione.

Questo è quello che ho finora:

function check_time($from, $to, $time) { 
    $time = strtotime($time); 
    $from = strtotime($from); 
    $to_ = strtotime($to); 
    $to = $to_ <= $from ? strtotime($to . " tomorrow") : $to_; 
    return ($time >= $from && $time <= $to); 
} 

$timeslots = array(
    array("16:00:00", "22:30:00"), 
    array("22:30:00", "16:00:00") 
); 
foreach ($timeslots as $slot) { 
    if (check_time($slot[0], $slot[1], date("H:i:s"))) 
     { 
      echo "true\n"; 
     } 
    else 
     { 
      echo "false\n";  
     } 
} 

Se l'ora corrente è 23:00:00, allora il risultato sarebbe

false 
true 

Ma se l'ora corrente è 12: 00:00 quindi il risultato sarebbe

false 
false 

anche se tecnicamente è tra le due volte.

So che ha a che fare con il fatto che se si tratta di un nuovo giorno, quindi il risultato per $from sarà più tardi nel corso della giornata. Quindi, invece di controllare per le 22.30 di ieri, controlla per le 22:30 di stasera.

mio problema è che io non riesco a venire con un modo per effettuare il passaggio $from volta al giorno precedente se ha bisogno di, simile a come forzo il tempo $to nel giorno successivo.

+0

Se sono importanti date, allora perché non aggiungerlo ai tuoi tempi? –

+0

I tempi sono dinamici. I timeslot sono memorizzati in un database e possono essere modificati a discrezione di un amministratore. Lo usiamo per suddividere gli invii in modo che le persone che esaminano gli invii abbiano un carico di lavoro uguale. –

risposta

7

Questo è molto più semplice di quanto ci si aspetti.Supponiamo di avere tre volte, t1, t2 e tn che rappresentano rispettivamente da, ae ora utente. Trattare questi tempi come sei numeri a due cifre (da 000000 a 235959) e verificare:

  • Se t1 e t2 sono presenti sullo stesso lato del confine mezzanotte
    • Verificare se tn si trova tra t1 e t2
  • Else
    • Controllare se tn non si trovano tra t2 e t1

codice e test:

function check_time($t1, $t2, $tn) { 
    $t1 = +str_replace(":", "", $t1); 
    $t2 = +str_replace(":", "", $t2); 
    $tn = +str_replace(":", "", $tn); 
    if ($t2 >= $t1) { 
     return $t1 <= $tn && $tn < $t2; 
    } else { 
     return ! ($t2 <= $tn && $tn < $t1); 
    } 
} 
$tests = array(
    array("16:00:00", "22:30:00", "15:00:00"), 
    array("16:00:00", "22:30:00", "16:00:00"), 
    array("16:00:00", "22:30:00", "22:29:59"), 
    array("16:00:00", "22:30:00", "22:30:00"), 
    array("16:00:00", "22:30:00", "23:59:59"), 
    array("22:30:00", "16:00:00", "22:29:59"), 
    array("22:30:00", "16:00:00", "22:30:00"), 
    array("22:30:00", "16:00:00", "15:59:59"), 
    array("22:30:00", "16:00:00", "16:00:00"), 
    array("22:30:00", "16:00:00", "17:00:00") 
); 
foreach($tests as $test) { 
    list($t1, $t2, $t0) = $test; 
    echo "$t1 - $t2 contains $t0: " . (check_time($t1, $t2, $t0) ? "yes" : "no") . "\n"; 
} 
// OUTPUT 
// 
// 16:00:00 - 22:30:00 contains 15:00:00: no 
// 16:00:00 - 22:30:00 contains 16:00:00: yes 
// 16:00:00 - 22:30:00 contains 22:29:59: yes 
// 16:00:00 - 22:30:00 contains 22:30:00: no 
// 16:00:00 - 22:30:00 contains 23:59:59: no 
// 22:30:00 - 16:00:00 contains 22:29:59: no 
// 22:30:00 - 16:00:00 contains 22:30:00: yes 
// 22:30:00 - 16:00:00 contains 15:59:59: yes 
// 22:30:00 - 16:00:00 contains 16:00:00: no 
// 22:30:00 - 16:00:00 contains 17:00:00: no 
+0

+1 per originalità (NON) :) È una specie di cosa ho detto ... – CodeAngry

+1

Molto apprezzato, è esattamente quello che stavo cercando. Non avevo nemmeno pensato di convertire i tempi in numeri interi e confrontarli come numeri normali. Immagino che dovrei andare a dormire prima di mezzanotte invece di preoccuparmi di controllare se è mezzanotte. –

2
function check_time($time, $threshold){ 
    $times = array(&$time, &$threshold); 
    foreach($times as &$ts){ 
     if(!preg_match('~^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$~', $ts)){ 
      return false; 
     } 
     $ts = intval(preg_replace('~[^0-9]+~', null, $ts)); 
    } 
    return ($time >= $threshold) ? 2 : 1; 
} 

var_dump(check_time(date("H:i:s"), '12:00:00')); 

Ho imbrogliato! Seguiamo la logica:

  • Ogni volta che può essere convertito in un intero, se togliamo la punteggiatura.
  • Ho rimosso la punteggiatura dallo $time che si desidera testare e ne è diventato un numero intero.
  • Ho fatto la stessa cosa allo $threshold che è la data in cui si rompono gli spazi.
  • Questa funzione controlla solo se il numero intero $time è precedente o successivo allo $threshold.
  • Non importa alle date, domani, alla relatività temporale e così via.

Se fallisce (male ingresso) è returns false. Se si riesce restituisce un numero intero: - se prima la soglia - se dopo la soglia

spero che si adatta alle vostre esigenze.

Problemi correlati