• 14-07-2013, 00:41:04
    #1
    Merhaba,

    Belli saatler arası hizmet veren kullanıcılar var ve bu bir durum bilgisi olarak profilde listelenmektedir. Örneğin

    Şimdiki Saat: 15:00

    Erhan - 08:00 ile 16:00 arası hizmet vermektedir. Şu an MÜSAİT
    Ayşe - 08:00 ile 22:00 arası hizmet vermektedir. Şu an MÜSAİT
    Tarık - 11:00 ile 14:00 arası hizmet vermektedir. Şu an MÜSAİT DEĞİL

    gibi.

    kontrolü
    if(in_array( $simdikisaat , range( $baslangic , $bitis ) ) ){ .....

    ile yapmaktayım.

    fakat sorunum var eğer;

    Şimdiki saat: 01:00 ise,

    Fatih - 22:00 ile 04:00 arası hizmet vermektedir. Şu an MÜSAİT DEĞİL


    durumu oluşuyor. Bu saat olayını profesyonel bi şekilde çözmem gerek.
    Teşekkürler.
  • 14-07-2013, 00:42:47
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Hemşerim birazdan çözümü paylaşayım. Şuan kodunu yazıyorum.

    edit: uykum geldi heralde benim olayı çözemedim test için ufak bi betik yazdım işinize yarayabilir.

    <?php
    	
    	function check($start, $end) {
    		$_timestamp_now = strtotime(date('H:i'));
    		$_timestamp_start = strtotime($start);
    		$_timestamp_end = strtotime($end);
    	/*	var_dump([
    			'a' => ($_timestamp_now >= $_timestamp_start),
    			'b' => ($_timestamp_now <= $_timestamp_end),
    			'c' => ($_timestamp_now >= $_timestamp_start) || ($_timestamp_now <= $_timestamp_end),
    			'd' => ($_timestamp_now >= $_timestamp_start) && ($_timestamp_now <= $_timestamp_end),
    			'e' => ($_timestamp_start >= $_timestamp_end),
    			'f' => ($_timestamp_end >= $_timestamp_start),
    			'g' => ($_timestamp_start <= $_timestamp_end),
    			'h' => ($_timestamp_end <= $_timestamp_start),
    			($_timestamp_now <= $_timestamp_end)
    		]);*/
    		
    		if($_timestamp_start >= $_timestamp_end) {
    			$timestamp_now = strtotime(date('d.m.Y H:i'));
    			$timestamp_start = strtotime(sprintf('%s %s', date('d.m.Y'), $start));
    			$timestamp_end = strtotime(sprintf('%s.%s %s', (date('d') + 1), date('m.Y'), $end));
    			echo substr(date('H', $timestamp_end), 0, 1);
    			
    			if(substr(date('H', $timestamp_end), 0, 1) != '0')
    				return false;
    			else if($timestamp_now <= $timestamp_start)
    				return false;
    			else if($timestamp_now >= $timestamp_end)
    				return false;
    			else
    				return true;
    		} else {
    			$timestamp_now = strtotime(date('d.m.Y H:i'));
    			$timestamp_start = strtotime(sprintf('%s %s', date('d.m.Y'), $start));
    			$timestamp_end = strtotime(sprintf('%s.%s %s', (date('d') + 1), $end));
    			
    			if($timestamp_now <= $timestamp_start)
    				return true;
    			else if($timestamp_now >= $timestamp_end)
    				return true;
    			else
    				return false;
    		}
    		
    	#	return (($_timestamp_now >= $_timestamp_start) || ($_timestamp_now <= $_timestamp_end)) ? true : false;
    	}
    	
    #	check("22:00", "21:00");
    	
    #	check("22:00", "04:00");
    //	echo check("22:00", "04:00");
    	
    	if(check("22:00", "04:00"))
    		echo 'saat aralığı içinde!';
    	else
    		echo 'saat aralığı dışında!';
  • 14-07-2013, 05:19:31
    #3
    Kimlik doğrulama veya yönetimden onay bekliyor.
    saintx adlı üyeden alıntı: mesajı görüntüle
    Hemşerim birazdan çözümü paylaşayım. Şuan kodunu yazıyorum.

    edit: uykum geldi heralde benim olayı çözemedim test için ufak bi betik yazdım işinize yarayabilir.

    <?php
    	
    	function check($start, $end) {
    		$_timestamp_now = strtotime(date('H:i'));
    		$_timestamp_start = strtotime($start);
    		$_timestamp_end = strtotime($end);
    	/*	var_dump([
    			'a' => ($_timestamp_now >= $_timestamp_start),
    			'b' => ($_timestamp_now <= $_timestamp_end),
    			'c' => ($_timestamp_now >= $_timestamp_start) || ($_timestamp_now <= $_timestamp_end),
    			'd' => ($_timestamp_now >= $_timestamp_start) && ($_timestamp_now <= $_timestamp_end),
    			'e' => ($_timestamp_start >= $_timestamp_end),
    			'f' => ($_timestamp_end >= $_timestamp_start),
    			'g' => ($_timestamp_start <= $_timestamp_end),
    			'h' => ($_timestamp_end <= $_timestamp_start),
    			($_timestamp_now <= $_timestamp_end)
    		]);*/
    		
    		if($_timestamp_start >= $_timestamp_end) {
    			$timestamp_now = strtotime(date('d.m.Y H:i'));
    			$timestamp_start = strtotime(sprintf('%s %s', date('d.m.Y'), $start));
    			$timestamp_end = strtotime(sprintf('%s.%s %s', (date('d') + 1), date('m.Y'), $end));
    			echo substr(date('H', $timestamp_end), 0, 1);
    			
    			if(substr(date('H', $timestamp_end), 0, 1) != '0')
    				return false;
    			else if($timestamp_now <= $timestamp_start)
    				return false;
    			else if($timestamp_now >= $timestamp_end)
    				return false;
    			else
    				return true;
    		} else {
    			$timestamp_now = strtotime(date('d.m.Y H:i'));
    			$timestamp_start = strtotime(sprintf('%s %s', date('d.m.Y'), $start));
    			$timestamp_end = strtotime(sprintf('%s.%s %s', (date('d') + 1), $end));
    			
    			if($timestamp_now <= $timestamp_start)
    				return true;
    			else if($timestamp_now >= $timestamp_end)
    				return true;
    			else
    				return false;
    		}
    		
    	#	return (($_timestamp_now >= $_timestamp_start) || ($_timestamp_now <= $_timestamp_end)) ? true : false;
    	}
    	
    #	check("22:00", "21:00");
    	
    #	check("22:00", "04:00");
    //	echo check("22:00", "04:00");
    	
    	if(check("22:00", "04:00"))
    		echo 'saat aralığı içinde!';
    	else
    		echo 'saat aralığı dışında!';
    Yav ne ettin öyle

    Basitçe başlangıç bitişden büyükse 24'e tamamlayacaksın. Misal:

    function durum($simdi, $basla, $bitis){
    	if($bitis < $basla){
    		$a = $basla;
    		while($a<=24){ $av[] = $a;	$a++;	}
    		$a = 1;
    		while($a<= $bitis){	$av[] = $a;	$a++;	}
    	}else{
    		$av = range($basla,$bitis);
    	}
    	if(in_array($simdi,$av)) echo 'MÜSAİT';
    	else echo 'MÜSAİT DEĞİL';
    }
    Kullanımı:
    $simdi = 1; $basla = 22; $bitis = 4;
    durum($saat, $basla, $bitis);
    //MÜSAİT
  • 14-07-2013, 11:13:59
    #4
    acayip adlı üyeden alıntı: mesajı görüntüle
    Yav ne ettin öyle

    Basitçe başlangıç bitişden büyükse 24'e tamamlayacaksın. Misal:

    function durum($simdi, $basla, $bitis){
    	if($bitis < $basla){
    		$a = $basla;
    		while($a<=24){ $av[] = $a;	$a++;	}
    		$a = 1;
    		while($a<= $bitis){	$av[] = $a;	$a++;	}
    	}else{
    		$av = range($basla,$bitis);
    	}
    	if(in_array($simdi,$av)) echo 'MÜSAİT';
    	else echo 'MÜSAİT DEĞİL';
    }
    Kullanımı:
    $simdi = 1; $basla = 22; $bitis = 4;
    durum($saat, $basla, $bitis);
    //MÜSAİT
    $simdi = 1; $basla = 22; $bitis = 24;
    durum($simdi, $basla, $bitis);
    //MÜSAİT DEĞİL ?
  • 14-07-2013, 14:40:21
    #5
    acayip adlı üyeden alıntı: mesajı görüntüle
    Yav ne ettin öyle

    Basitçe başlangıç bitişden büyükse 24'e tamamlayacaksın. Misal:

    function durum($simdi, $basla, $bitis){
        if($bitis < $basla){
            $a = $basla;
            while($a<=24){ $av[] = $a;    $a++;    }
            $a = 1;
            while($a<= $bitis){    $av[] = $a;    $a++;    }
        }else{
            $av = range($basla,$bitis);
        }
        if(in_array($simdi,$av)) echo 'MÜSAİT';
        else echo 'MÜSAİT DEĞİL';
    }
    Kullanımı:
    $simdi = 1; $basla = 22; $bitis = 4;
    durum($saat, $basla, $bitis);
    //MÜSAİT

    Şuan saat 1 ise (1am) işe başlama 22 ve bitis 4(am) ise malesef fonksiyonunuz çalışmıyor.
  • 14-07-2013, 16:03:01
    #6
    agnosi adlı üyeden alıntı: mesajı görüntüle
    Şuan saat 1 ise (1am) işe başlama 22 ve bitis 4(am) ise malesef fonksiyonunuz çalışmıyor.
    fonksiyon için tam tarih bilgisi gerekicek sanırım?
  • 14-07-2013, 21:51:22
    #7
    agnosi adlı üyeden alıntı: mesajı görüntüle
    Şuan saat 1 ise (1am) işe başlama 22 ve bitis 4(am) ise malesef fonksiyonunuz çalışmıyor.
    Arkadaşım çalışıyor sorun yok. Ben fonksiyona gönderirken $bitis yerine $saat yazmışım. Bu arada o anki saati date('G') olarak yani 0 dolgusuz alırsan daha iyi olur :

    $simdi = 1; $basla = 22; $bitis = 4;
    durum($simdi, $basla, $bitis);
    //MÜSAİT
  • 14-07-2013, 21:51:45
    #8
    http://stackoverflow.com/a/17145145/1561146

    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";
    }
  • 15-07-2013, 00:09:26
    #9
    acayip adlı üyeden alıntı: mesajı görüntüle
    Arkadaşım çalışıyor sorun yok. Ben fonksiyona gönderirken $bitis yerine $saat yazmışım. Bu arada o anki saati date('G') olarak yani 0 dolgusuz alırsan daha iyi olur :

    $simdi = 1; $basla = 22; $bitis = 4;
    durum($simdi, $basla, $bitis);
    //MÜSAİT
    Evet o saat nerden çıktıysa benimde dikkatimden kaçmış. Teşekkür ederim. Sorunsuz çalışıyor.


    Hemşerim Ogün, kodun biraz karmaşık olduğu için tercih etmedim. İlgin için teşekkür ederim.

    Bende olayı iç içe if ile çözdüm onuda yazayım birilerinin işine yarayabilir.

    <?php
        $simdi="10";
        $baslangic ="8";
        $bitis = "22";
        
        if ($bitis < $baslangic){
            if ($simdi >= $baslangic OR $simdi <= $bitis)
           {
           } else {
           echo "kapalı";
           }
        } else {
            if ($simdi >= $baslangic AND $simdi <= $bitis)
           {
           } else {
           echo "kapalı";
           }
        }
            ?>