2016-01-19 6 views
0

Мне нужно проверить, что данный период будет, по крайней мере, закрыт в одну ночь выходного дня (субботняя ночь или вечер воскресенья) (см. wiki article о правиле).Этот период, по крайней мере, охватывает одну ночь в выходные дни

Я нашел this question, что, как проверить дату, является ли это падение на выходные или нет,

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) 

правило должно засыхают дата начала выпадает на выходные или дата окончания падает на солнце день или период охватывает полный выходной день.

+0

Итак, прокрутите даты от начала до конца периода и проверьте. (Как только вы обнаружили, что первая суббота или воскресенье закрыты, вы можете закончить цикл.) – CBroe

+0

@ CBroe работает над ним, спасибо за подсказку –

ответ

2

Я полагаю, что вы ищете что-то вроде этого:.

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.

+1

Небольшое улучшение: вы можете вернуть true в if-части, а не назначать ее переменной и концу петля сразу, когда есть матч с выходными. – honzalilak

+0

@honzalilak Хороший улов, спасибо :) – Mikey