функция php для подсчета 30 дней, но без конца недели или праздника

мне нужна помощь.

Мне нужно создать функцию php на счет 30 дней. Но если последний день выходной или праздничный. Поэтому мне приходится складывать дни, чтобы последний день был рабочим. 30 дней не должны заканчиваться выходными или праздником. Я искал форумы и гугл, но ничего не нашел. Я обнаружил, что подсчитываются рабочие дни, но не то, что мне нужно. Спасибо за помощь.

          $holiday = array(
            '01-01',
            '01-06',
            '03-30',
            '04-01',
            '04-02',
            '05-01',
            '05-08',
            '07-05',
            '08-29',
            '09-01',
            '09-15',
            '11-01',
            '11-17',
            '12-24',
            '12-25',
            '12-26',
          );

          $count = 0;
          $temp = strtotime($row['prijem']); //example as today is 2016-03-25
          while($count<30){
              $newdate = strtotime('+1 day', $temp);
              $nextnewdate = date('m-d', $newdate);
              if(!in_array($nextnewdate, $holiday)){
                  $count++;
              }
              $temp = $newdate;
          }

          $end = date("d.m.Y", $temp);

дата начала 24.05.2018, сегодня. дата окончания - 23.06.2018.

и теперь мне нужно всегда, когда дата окончания - выходные или праздничные дни, преобразованные в рабочий день. Итак, если дата окончания суббота, то результат будет в понедельник 25.06.2018. И опять же, если бы это был праздник, добавьте еще дней к рабочему дню.


person Imrich Repka    schedule 24.05.2018    source источник
comment
Ожидается, что вы сами попытаетесь решить свою проблему. Если вы еще этого не сделали, сделайте это сейчас. Если да, укажите код, который вы пробовали, объясните ожидаемый результат и фактический результат, включая любые ошибки.   -  person Patrick Q    schedule 24.05.2018
comment
Получите сегодняшние части даты (месяц, день, год) и создайте новую метку времени через mktime() и добавьте 30 к дню. Проверьте день недели для этого дня на субботу / воскресенье (а затем выполните проверку грубой силы на федеральные или религиозные праздники и т. Д., Если необходимо - для этого есть API ...), и если полученный день не является рабочий день добавить день и проверить еще раз.   -  person ivanivan    schedule 24.05.2018
comment
это могло сработать. А вы знаете конкретные API? Или найду в Интернете.   -  person Imrich Repka    schedule 24.05.2018


Ответы (1)


В этом цикле нет необходимости, поскольку вас волнует только то, является ли 30-й день рабочим или нет (вместо того, чтобы заботиться о том, является ли каждый промежуточный день). Просто добавьте 30 дней и проверьте результат.

$holidays = array(
            '01-01',
            '01-06',
            '03-30',
            '04-01',
            '04-02',
            '05-01',
            '05-08',
            '07-05',
            '08-29',
            '09-01',
            '09-15',
            '11-01',
            '11-17',
            '12-24',
            '12-25',
            '12-26',
          );

// the starting date, $row['prijem'] in your example
$temp = strtotime("2016-03-25");

// add 30 days to the starting date
$plus30days = strtotime("+30 days", $temp);

// while the end date is a holiday or weekend, add another day
// do this check until the end date is _not_ a weekend or holiday
while(in_array(date("m-d", $plus30days), $holidays) || date('N', $plus30days) >= 6)
{
    $plus30days = strtotime("+1 day", $plus30days);
}

echo date("d.m.Y", $plus30days);

ДЕМО

person Patrick Q    schedule 24.05.2018
comment
Так оно и есть. Мой удалил, ты быстрее машинистка :) - person ivanivan; 25.05.2018