• 27-10-2018, 00:36:15
    #1
    Merhaba, PHP ile mesai hesaplaması yapmam gerekiyor.
    Bunları vardiya şeklinde ayırmam gerekiyor. 2 tarih arasında ki vardiya tiplerin göre çalışma süresini almaya çalışıyorum. Aslında kod sağlıklı çalışıyor fakat gün sayısı 2 günü geçtiğinde problem yaşıyorum.
    Mesai Başlangıç: 2018-09-09 13:43
    Mesai Bitiş: 2018-09-11 07:13
    Sonuç: 07:18 | 04:00 | 04:00 | 02:00 | 17:18
    Yardım edebilecek birileri var mı acaba?

    <?php
    function intersection($s1, $e1, $s2, $e2,$day) {
        return subintersection($s1,$e1,$s2,$e2)+subintersection($s1,$e1,$s2+$day,$e2+$day);
    }
    function subintersection($s1, $e1, $s2, $e2) {
        if ($e1 < $s2)
                return 0;
        if ($s1 > $e2)
                return 0;
        if ($s1 < $s2)
                $s1 = $s2;
        if ($e1 > $e2)
                $e1 = $e2;
        return $e1 - $s1;
    }
    function minuteToHours($time, $format = '%02d:%02d') {
      if ($time < 1) {
        return;
      }
      $hours = floor($time / 60);
      $minutes = ($time % 60);
      return sprintf($format, $hours, $minutes);
    }
    function calculateWork($strstart, $strend, $arg = NULL){
      $day= 3600*24;
      $strS = strtotime($strstart);
      $strE = strtotime($strend);
      $date_start = date('Y-m-d', $strS);
      $date_end = date('Y-m-d', $strE);
      $hour_start = date('H:i', $strS);
      $hour_end = date('H:i', $strE);
      $start = strtotime($hour_start);
      $end = strtotime($hour_end);
      if($date_start != $date_end){
        $end = $end + 3600*24;
      }
      $tip1_start = strtotime("06:00");
      $tip1_end = strtotime("20:00");
    
      $tip2_start = strtotime("20:00");
      $tip2_end = strtotime("00:00") + 3600*24;
    
      $tip3_start = strtotime("00:00");
      $tip3_end = strtotime("04:00");
    
    $tip4_start = strtotime("04:00");
    $tip4_end = strtotime("06:00");
      $tip1 = intersection( $start, $end, $tip1_start, $tip1_end, $day) / 60;
      $tip2 = intersection( $start, $end, $tip2_start, $tip2_end, $day) / 60;
      $tip3 = intersection( $start, $end, $tip3_start, $tip3_end, $day) / 60;
      $tip4 = intersection( $start, $end, $tip4_start, $tip4_end, $day) / 60;
      if(null !== minuteToHours($tip1, '%02d:%02d')){
        $t1 = minuteToHours($tip1, '%02d:%02d');
      }
      if(null !== minuteToHours($tip2, '%02d:%02d')){
        $t2 = minuteToHours($tip2, '%02d:%02d');
      }
      if(null !== minuteToHours($tip3, '%02d:%02d')){
        $t3 = minuteToHours($tip3, '%02d:%02d');
      }
      if(null !== minuteToHours($tip4, '%02d:%02d')){
        $t4 = minuteToHours($tip4, '%02d:%02d');
      }
      $topla = $tip1 + $tip2 + $tip3 + $tip4;
      $total = minuteToHours($topla, '%02d:%02d');
      return "{$t1}|{$t2}|{$t3}|{$t4}|{$total}";
    }
    echo calculateWork("2018-09-09 13:43", "2018-09-10 07:01");
    //07:18|04:00|04:00|02:00|17:18
  • 27-10-2018, 00:49:02
    #2
    Üyeliği durduruldu
    $eskiTarih = "12.01.2018 18:00";
    $yeniTarih = "13.01.2018 18:00";
    $timeDiff = strtotime($eskiTarih) - strtotime($yeniTarih);
    if($timeDiff >86400){
    echo '1 gun calisti';
    }
  • 27-10-2018, 00:53:02
    #3
    oxcakmak adlı üyeden alıntı: mesajı görüntüle
    $eskiTarih = "12.01.2018 18:00";
    $yeniTarih = "13.01.2018 18:00";
    $timeDiff = strtotime($eskiTarih) - strtotime($yeniTarih);
    if($timeDiff >86400){
    echo '1 gun calisti';
    }
    Biraz daha açabilir misiniz hocam?
  • 27-10-2018, 00:55:31
    #4
    Üyeliği durduruldu
    xphyre adlı üyeden alıntı: mesajı görüntüle
    Biraz daha açabilir misiniz hocam?
    Hocam şöyle ben 24 saat arasındaki farkı gösterdim sende çalıştığı tarihleri çıkartıp gün saat şeklinde saniye ile hesabını yapacaksın. 86400 saniye olmuşsa 1 günçalışmış demektir.
  • 27-10-2018, 00:59:29
    #5
    oxcakmak adlı üyeden alıntı: mesajı görüntüle
    Hocam şöyle ben 24 saat arasındaki farkı gösterdim sende çalıştığı tarihleri çıkartıp gün saat şeklinde saniye ile hesabını yapacaksın. 86400 saniye olmuşsa 1 günçalışmış demektir.
    Hocam, mantığınızda doğrusunuz, bende bir kaç saattir şu kod parçasıyla ilgilene ilgilene beyin kalmadı açıkcası.
    Fakat tip1, tip2, tip3 ve tip4 farklarınıda net olarak almam gerekiyor. Nasıl yapacağım konusunda da kafam pek basmıyor. Zaman hesaplamaları ile aramda pek iyi değil. Tarihler arasında 1 günlük fark olduğunda problem olmuyor fakat ne hikmetse yada nerede hata yapıyorsam bir türlü göremiyorum. 2 gün fark olduğunda sonucu yanlış veriyor.
  • 27-10-2018, 01:09:42
    #6
    Üyeliği durduruldu
    hocam foreach yada while döngüsü içinde belirtilen saatleri in array ile kontrol edeceksiniz. sonra ... şu kadar çalıştı diye yazacak. ama sen bana temiz bir şekilde ne olacağını söyle ben sana yarın kodları hazırlarım.
  • 27-10-2018, 01:13:56
    #7
    oxcakmak adlı üyeden alıntı: mesajı görüntüle
    hocam foreach yada while döngüsü içinde belirtilen saatleri in array ile kontrol edeceksiniz. sonra ... şu kadar çalıştı diye yazacak. ama sen bana temiz bir şekilde ne olacağını söyle ben sana yarın kodları hazırlarım.
    Valla çok iyi olur hocam.
    Şimdi, 4 adet vardiya tipimiz var hocam.
    TİP 1: 06:00 - 20:00
    TİP 2: 20:00 - 00:00
    TİP 3: 00:00 - 04:00
    TİP 4: 04:00 - 06:00
    Verilen tarih aralığı arasında, personel bu vardiya tiplerinde ne kadar süre çalıştığını hesaplamaya çalışıyorum.
    Valla hocam halledebilirseniz, aklıma her geldiğinizde sizin duacınız olurum.