2015-10-30 2 views
2

Я работаю над функцией планирования для обработки повторяющихся событий в приложении. Один из вариантов - «Каждый первый рабочий день» (месяца). У меня есть функция, которая работает, но я боюсь, что не могу использовать самый эффективный метод и надеялся на какой-то ввод. Я использую PHP 5.5. Это код, который у меня есть:Тестирование на первый рабочий день месяца в PHP

function isFirstWeekday($dateObject){ 
    $dayToTest = $dateObject->format('l'); 
    $monthToTest = $dateObject->format('F Y'); 
    $priorDay = clone $dateObject; 
    $priorDay->modify('- 1 day'); 
    $weekdayList = array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday"); 
    //Return false if it's not a weekday 
    if (!in_array($dateObject->format('l'), $weekdayList)) { 
    return FALSE; 
    } 
    //Make sure that this weekday is the first of its name in the month 
    if ($dateObject->format('Y-m-d') !== date('Y-m-d', strtotime("first $dayToTest of $monthToTest"))) { 
    return FALSE; 
    } 
    //Make sure that the day before was not a weekday in the same month 
    if (in_array($priorDay->format('l'), $weekdayList) && $priorDay->format('m') === $dateObject->format('m')) { 
    return FALSE; 
    } 
    return TRUE; 
} 

ответ

1

Я бы посмотрел на него по-другому.

1) Для того, чтобы это был первый будний день, это должен быть первый, второй или третий день месяца.

2) Если это первый день, вы можете прямо проверить, является ли это будним днем ​​(N = 1-5).

3) Если это второй или третий, то для того, чтобы быть первым будним днем, продолжающиеся дни должны были НЕ быть неделями. Поэтому просто проверьте, понедельник ли это.

function isFirstWeekday($dateObject) { 
    switch($dateObject->format('j')) { 
     case 1: 
      return $dateObject->format('N') <= 5; 
     case 2: 
     case 3: 
      return $dateObject->format('N') == 1; 
     default: 
      return false; 
    } 
} 
+0

Это намного менее интенсивный процессор. Я не понимал, что условные возвращения там, где есть опция. Я изучал PHP всего год, и мне это просто не приходило в голову. Я не могу проверить, пока не вернусь в офис в понедельник, но посмотрев документацию и подумав, что это выглядит великолепно. Спасибо! – resident0

Смежные вопросы