Мне нужно проверить, что данный период будет, по крайней мере, охватывать одну ночь выходных (суббота или воскресенье) (см. статья в вики о правиле).
я нашел этот вопрос что, как проверить дату падения на выходные или нет,
function isWeekend($date) {
$weekDay = date('w', strtotime($date));
return ($weekDay == 0 || $weekDay == 6);
}
Но все же я борюсь с тем, как реализовать функцию, чтобы получить следующие результаты выборки для заданных периодов,
Периоды выборки и результаты:
04-01-2016 / 07-01-2016 : false
04-01-2016 / 09-01-2016 : false
04-01-2016 / 10-01-2016 : true (covers saturday night)
03-01-2016 / 07-01-2016 : true (covers sunday night)
04-01-2016 / 14-01-2016 : true (covers a full weekend)
Правило должно начинаться с даты начала, приходящейся на выходные, или с даты окончания, приходящейся на воскресенье или период, охватывающий полные выходные.
Я полагаю, вы ищете что-то вроде этого:
function coversWeekend($start, $end) {
$weekend = [0, 6]; // 0 for Sunday, 6 for Saturday.
// Loop over the date period.
while ($start < $end) {
if (in_array($start->format('w'), $weekend)) {
return true;
}
$start->modify('+1 day');
}
return false;
}
Имейте в виду, что при проверке того, что пользователь передает, нет проверки. Вы можете добавить проверку, что для каждого параметра был передан действительный объект DateTime.
Надеюсь, поможет.
Редактировать: Обновлено решение с отзывами @ honzalilak.
Других решений пока нет …