2013-06-17 34 views
5

alıştırma süresine sahip olup olmadığımı kontrol edin Kullanıcı gönderimlerini kabul eden bir sistemim var ve bir gönderim aldıktan sonra sistem uygun zaman dilimini bulmak için tüm zaman aralıklarından geçecektir. Sorun, bitiş zamanı bir sonraki güne geçerse, başlangıç ​​& bitiş zamanlarına karşı kontrol edebilmesinin gerekmesidir.Geçerli saat iki kez arasında olup olmadığını kontrol edin,

Aşağıdaki örnekte atın: Bir zaman dilimi geçerli gün saat 10.30'da başlar ve ertesi gün saat 16: 00'da sona erer. Geçerli saat 10:30 PM ile 11:59:59 PM arasındaysa, gönderim o zaman dilimine atanacaktır. Ancak, şimdiki saat 12:00 ile 16:00 arasında ise o zaman zaman dilimini atlar. Geçerli saat 23:00:00 ise,

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

sonra sonuç

false 
true 

olurdu Ama şimdiki zaman 12 ise:

Bu

Bugüne kadar ne var: 00:00 sonra sonuç iki kez arasında teknik olarak olsa bile

false 
false 

olurdu.

Yeni bir gün olması durumunda, $from için strtotime sonucunun günün ilerleyen saatlerinde olacağını bilmesi gerektiğini biliyorum. Yani dün 10:30 için kontrol etmek yerine, bu gece saat 10:30 için kontrol ediyor.

Sorunum, $to saatini bir sonraki güne zorladığım gibi, gerekiyorsa önceki güne $from zaman geçişini yapmanın bir yolunu bulmuyorum.

+0

tarihleri ​​önemliyse, o zaman neden senin zamanlarda ekleyin? –

+0

Zamanlar dinamiktir. Zaman dilimleri bir veritabanında saklanır ve bir yöneticinin takdirine bağlı olarak değiştirilebilir. Gönderimleri bölüştürmek için kullanırız, böylece gönderimleri inceleyen kişiler eşit iş yüküne sahiptir. Özgünlük için –

cevap

7

Beklediğinizden çok daha kolay.Sırasıyla, kullanıcı zamanını temsil eden üç kez, t1, t2 ve tn olduğunu varsayın. (000000 den 235959 kadar) altı basamaklı sayılar olarak bu kez davranın ve check:

  • Eğer t1 ve t2 gece yarısı sınırı aynı tarafında mevcut tn yatıyor
    • Kontrol eğer
    t1 ila t2tnarasında yalan değilse
  • Else
    • Kontrolve t1

Kodu ve testler:

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 (DEĞİL) :) Dediğim gibi bir şey ... – CodeAngry

+1

Çok beğenildi, tam olarak aradığım şey buydu. Zamanları tam sayılara dönüştürmeyi ve onları normal sayılar ile karşılaştırmayı düşünmemiştim bile. Gece yarısı olup olmadığını kontrol etmek yerine, gece yarısına kadar uyuyabilirim sanırım. –

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')); 

Aldattım! mantığını takip edelim: Biz noktalamayı kaldırmak eğer

  • Her zaman tam sayıya dönüştürülebilir.
  • Noktalama işaretini sınamak ve tamsayı yapmak istediğiniz $time'dan kaldırdım.
  • Aynı şeyi, yuvaları kırılan tarih olan $threshold'a da yaptım.
  • Bu işlev, yalnızca $time tam sayısının $threshold'dan önce mi yoksa sonra mı olduğunu kontrol eder.
  • Bu tarihler, yarın, zaman görelilik ve benzeri hiçbir şey umursamıyor.

o (kötü girişi) başarısız olursa o returns false. o başarılı olursa bir tamsayı döndürür: - eğer önce eşik - eğer

ihtiyaçlarınıza uyan Umut eşik sonra.

İlgili konular