например у меня есть две даты 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;
}
в основном я хочу добавить подсчет + солнце к диапазону дат.
Хитрость заключается в использовании алгоритма типа O (1) для решения этой проблемы.
Учитывая вашу дату начала, перейдите в первую субботу. Позвони from
Учитывая дату окончания, вернитесь к предыдущей пятнице. Позвони to
Если у вас нет крайнего случая (где to
меньше чем from
), вычислить (to - from) * 2 / 7
как число выходных дней, и добавьте это к любым выходным дням, пропущенным в шагах (1) и (2).
Вот как я делаю это в производстве, хотя обобщено на произвольные выходные дни.
Используйте эту функцию:
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 周一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);
}