Узнать, сколько выходных в диапазоне дат

Например у меня есть две даты 2015-10-28 а также 2015-12-31, из них я хочу знать, сколько субботы и воскресенья в данном диапазоне дат. Я могу найти разницу между этими датами, но я не могу найти, сколько выходных.

кто-нибудь когда-нибудь делал это?

вот мой текущий код:

function createDateRange($maxDate, $cell, $lead, $offArray = array()){
    $dates = [];
    --$cell;
    --$lead;

    $edate = date('Y-m-d', strtotime($maxDate." -$lead day"));
    $sdate = date('Y-m-d', strtotime($edate." -$cell day"));

    $start = new DateTime($sdate);
    $end = new DateTime($edate);
    $end = $end->modify('+1 day');
    $interval = DateInterval::createFromDateString('1 day');
    $period = new DatePeriod($start, $interval, $end);

    foreach($period as $d){
        $dt = $d->format('Y-m-d');
        if(!in_array($dt, $dates)){
            $dates[] = $dt;
        }
    }

    return $dates;
}

в основном я хочу добавить подсчет + солнце к диапазону дат.

3 ответа

Хитрость заключается в использовании алгоритма типа O(1) для решения этой проблемы.

  1. Учитывая вашу дату начала, перейдите в первую субботу. Позвони from

  2. Учитывая дату окончания, вернитесь к предыдущей пятнице. Позвони to

  3. Если у вас нет крайнего случая (где to меньше чем from), вычислить (to - from) * 2 / 7 как число выходных дней, и добавьте это к любым выходным дням, пропущенным в шагах (1) и (2).

Вот как я делаю это в производстве, хотя обобщено на произвольные выходные дни.

  //周日0 周一1 .....
  $data = 4;//周四

  $t1 ='2015-10-28';
  $t2 = '2015-12-31';
  $datetime1 = date_create($t1);
  $datetime2 = date_create($t2);
  $interval = date_diff($datetime1, $datetime2);
  $day = $interval->format('%a');

  $result = ($day)/7;
  $start = getdate(strtotime($t1))['wday'];
  $end = getdate(strtotime($t2))['wday'];

  if($data>=$start && $data<=$end){
    echo floor($result)+1;
  }else{
    echo floor($result);
  }

Используйте эту функцию:

function getDateForSpecificDayBetweenDates($startDate, $endDate, $weekdayNumber)
{
    $startDate = strtotime($startDate);
    $endDate = strtotime($endDate);

    $dateArr = array();

    do
    {
        if(date("w", $startDate) != $weekdayNumber)
        {
            $startDate += (24 * 3600); // add 1 day
        }
    } while(date("w", $startDate) != $weekdayNumber);


    while($startDate <= $endDate)
    {
        $dateArr[] = date('Y-m-d', $startDate);
        $startDate += (7 * 24 * 3600); // add 7 days
    }

    return($dateArr);
}

Вызов функции для получения дат всех воскресений 2015 года:

$dateArr = getDateForSpecificDayBetweenDates('2015-01-01', '2015-12-31', 0);

print "<pre>";
print_r($dateArr);
Другие вопросы по тегам