2016-01-26 2 views

ответ

1

Более современный подход использует РНР Класс DateTime. Ниже вы получаете массив с номерами недели в виде ключей. Я добавил количество недель и выходных дней.

<?php 

$begin = new DateTime('2010-01-01'); 
$end = new DateTime('2010-01-25'); 

$interval = new DateInterval('P1D'); 
$daterange = new DatePeriod($begin, $interval, $end); 
$weekends = []; 

foreach($daterange as $date) { 
    if (in_array($date->format('N'), [6,7])) { 
     $weekends[$date->format('W')][] = $date->format('Y-m-d'); 
    } 
} 

print_r($weekends); 

echo 'Number of weeks: ' . count($weekends); 

echo 'Number of weekend days: ' . (count($weekends, COUNT_RECURSIVE) - count($weekends)); 

Примечание: если вы используете PHP 5.3, используйте array() вместо блочных массивов [].

+0

hy Schellingerht благодарит вас за ответ, но у меня есть quetion о вашем коде, что значение ** новый DateInterval ('P1D'); ** – b4dQuetions

+0

DateInterval - это шаги в ассортимент. P1D означает на шаг 1 день. Потому что вы не знаете, до какого числа день начала дня. В цикле foreach каждый день от начала до конца проходит. Затем я проверяю, является ли число дней 6 (суббота) или 7 (воскресенье). – schellingerht

+0

Привет @ bd4dQuetions. Ницца! Пожалуйста, отметьте правильный ответ для людей с одинаковой проблемой ;-) – schellingerht

0

Может быть, этот фрагмент кода поможет:

<?php 
    //get current month for example 
    $beginday = date("Y-m-01"); 
    $lastday = date("Y-m-t"); 

    $nr_work_days = getWorkingDays($beginday, $lastday); 
    echo $nr_work_days; 

    function getWorkingDays($startDate, $endDate) 
    { 
     $begin = strtotime($startDate); 
     $end = strtotime($endDate); 
     if ($begin > $end) { 
      echo "startdate is in the future! <br />"; 

      return 0; 
     } else { 
      $no_days = 0; 
      $weekends = 0; 
      while ($begin <= $end) { 
       $no_days++; // no of days in the given interval 
       $what_day = date("N", $begin); 
       if ($what_day > 5) { // 6 and 7 are weekend days 
        $weekends++; 
       }; 
       $begin += 86400; // +1 day 
      }; 
      $working_days = $no_days - $weekends; 

      return $working_days; 
     } 
    } 

Другим решением может быть: (Get date range between two dates excluding weekends)

+0

Также это будет полезно: (http://stackoverflow.com/questions/3352712/get-date-range-between-two-dates-excluding-weekends) –

0

Это может помочь, может быть:

$start = strtotime('2010-01-01'); 
$end = strtotime('2010-01-25'); 

$differ = $end-$start; 

$min = $differ/60; 
$hrs = $min/60; 
$days = $hrs/24; 
$weeks = $days/7; 


if(is_int($weeks)) 
$weeks++; 

echo '<pre>'; 
print_r(ceil($weeks)); 
echo '</pre>'; 
+0

hy, pritesh Я попытался использовать ваш код, но не работа для меня Я постараюсь с даты ** $ start = strtotime ('2016-01-01'); $ end = strtotime ('2016-01-08'); ** и результат должен быть ** 2 ** не ** 1 ** – b4dQuetions

+0

ok, так что вы не хотите, чтобы количество выходных дней, но число выходных дней в месяц. ..я прав?? – pritesh

+0

Hy pritesh yah ** номер выходного дня в месяц ** – b4dQuetions

Смежные вопросы