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

например у меня есть две даты 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;
}

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

0

Решение

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

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

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

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

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

1

Другие решения

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

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);
0

  //周日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);
}
0
По вопросам рекламы [email protected]