• 17-08-2021, 03:51:11
    #1
    Merhaba,

    php ile iki tarih arasında çalışma günü hesaplıyorum. Bunda bir sorun yok tatil günleri vs sayıdan düşülüyor ama takıldığım nokta, yarım günlük düşüşler, örneğin arefe günleri. Buraya gireceğim günleri yarım gun olarak nasıl düşüp hesaplatabilirim. Bu konuda yardımcı olabilecek var mı? Şuan kullandığım kodu aşağıya bırakıyorum.


    function calismagunsay($from, $to) {
        $calismagunler = [1, 2, 3, 4, 5, 6]; # date format = N (1 = Monday, ...)
        $tatiller = ['*-01-01', '*-04-23', '*-05-01', '*-05-19', '*-07-15', '*-08-30', '*-10-29', '2021-05-13', '2021-05-14', '2021-05-15', '2021-07-20', '2021-07-21', '2021-07-22', '2021-07-23']; # variable and fixed holidays
    
        $arefe = ['*-10-28'];
    
        $from = new DateTime($from);
        $to = new DateTime($to);
        $to->modify('+1 day');
        $interval = new DateInterval('P1D');
        $periods = new DatePeriod($from, $interval, $to);
    
        $days = 0;
        foreach ($periods as $period) {
            if (!in_array($period->format('N'), $calismagunler)) continue;
            if (in_array($period->format('Y-m-d'), $tatiller)) continue;
            if (in_array($period->format('*-m-d'), $tatiller)) continue;
            $days++;
        }
        return $days;
  • Kabul Edilen Cevap
    • Bu kullanımlar doğru değil ama sizin paylaştığınız koda bağlı kalırsak şu şekilde yapılabilir.
      function calismagunsay($from, $to) {
          $calismagunler = [1, 2, 3, 4, 5, 6]; # date format = N (1 = Monday, ...)
          $tatiller = ['*-01-01', '*-04-23', '*-05-01', '*-05-19', '*-07-15', '*-08-30', '*-10-29', '2021-05-13', '2021-05-14', '2021-05-15', '2021-07-20', '2021-07-21', '2021-07-22', '2021-07-23']; # variable and fixed holidays
       
          $arefe = ['*-10-28'];
       
          $from = new DateTime($from);
          $to = new DateTime($to);
          $to->modify('+1 day');
          $interval = new DateInterval('P1D');
          $periods = new DatePeriod($from, $interval, $to);
       
          $days = 0;
          foreach ($periods as $period) {
              if (!in_array($period->format('N'), $calismagunler)) continue;
              if (in_array($period->format('Y-m-d'), $tatiller)) continue;
              if (in_array($period->format('*-m-d'), $tatiller)) continue;
              if (in_array($period->format('Y-m-d'), $arefe) OR in_array($period->format('*-m-d'), $arefe)) {
                  $days = $days + '0.5';
                  continue;
              }
              $days++;
          }
          
          return $days;
      }
  • 17-08-2021, 04:02:27
    #2
    Bence date formatı saatlı şeklinde çalışabilirsiniz, sonra if ile eğer saat 12:00:00 ise o zaman yarım gün vardır, 00:00:00 ise yoktur 😄
    Sonra $arefe verisine 12 saat eklenebilir.
  • 17-08-2021, 04:08:49
    #3
    Bu cevap, konu sahibi tarafından kabul edilebilir bir cevap olarak işaretlendi.
    Bu kullanımlar doğru değil ama sizin paylaştığınız koda bağlı kalırsak şu şekilde yapılabilir.
    function calismagunsay($from, $to) {
        $calismagunler = [1, 2, 3, 4, 5, 6]; # date format = N (1 = Monday, ...)
        $tatiller = ['*-01-01', '*-04-23', '*-05-01', '*-05-19', '*-07-15', '*-08-30', '*-10-29', '2021-05-13', '2021-05-14', '2021-05-15', '2021-07-20', '2021-07-21', '2021-07-22', '2021-07-23']; # variable and fixed holidays
     
        $arefe = ['*-10-28'];
     
        $from = new DateTime($from);
        $to = new DateTime($to);
        $to->modify('+1 day');
        $interval = new DateInterval('P1D');
        $periods = new DatePeriod($from, $interval, $to);
     
        $days = 0;
        foreach ($periods as $period) {
            if (!in_array($period->format('N'), $calismagunler)) continue;
            if (in_array($period->format('Y-m-d'), $tatiller)) continue;
            if (in_array($period->format('*-m-d'), $tatiller)) continue;
            if (in_array($period->format('Y-m-d'), $arefe) OR in_array($period->format('*-m-d'), $arefe)) {
                $days = $days + '0.5';
                continue;
            }
            $days++;
        }
        
        return $days;
    }
  • 17-08-2021, 04:15:16
    #4
    Çok teşekkür ederim,

    şuan için çözdüm sayenizde




    metehandemir adlı üyeden alıntı: mesajı görüntüle
    Bu kullanımlar doğru değil ama sizin paylaştığınız koda bağlı kalırsak şu şekilde yapılabilir.
    function calismagunsay($from, $to) {
        $calismagunler = [1, 2, 3, 4, 5, 6]; # date format = N (1 = Monday, ...)
        $tatiller = ['*-01-01', '*-04-23', '*-05-01', '*-05-19', '*-07-15', '*-08-30', '*-10-29', '2021-05-13', '2021-05-14', '2021-05-15', '2021-07-20', '2021-07-21', '2021-07-22', '2021-07-23']; # variable and fixed holidays
     
        $arefe = ['*-10-28'];
     
        $from = new DateTime($from);
        $to = new DateTime($to);
        $to->modify('+1 day');
        $interval = new DateInterval('P1D');
        $periods = new DatePeriod($from, $interval, $to);
     
        $days = 0;
        foreach ($periods as $period) {
            if (!in_array($period->format('N'), $calismagunler)) continue;
            if (in_array($period->format('Y-m-d'), $tatiller)) continue;
            if (in_array($period->format('*-m-d'), $tatiller)) continue;
            if (in_array($period->format('Y-m-d'), $arefe) OR in_array($period->format('*-m-d'), $arefe)) {
                $days = $days + '0.5';
                continue;
            }
            $days++;
        }
        
        return $days;
    }