Сценарий рабочих дней


Я использую сценарий, который я нашел в этом вопросе, SOen, и для подсчета количества рабочих дней без учета субботы и воскресенья (дает мне сделать только с воскресенье, tbm, изменив $what_day > 5 - $what_day > 6", например), он работает правильно, но я хотел бы включить в официальный календарь праздников Бразилии.

это сценарий, который работает (уже взяв мои данные формы):

    <?php
//get current month for example
$beginday = ($_POST ["Tdesl"]);
$lastday  = ($_POST ["Tinsem3"]);

$nr_work_days = getWorkingDays($beginday, $lastday);
echo $nr_work_days;

function getWorkingDays($startDate, $endDate)
{
    $begin = strtotime($startDate);
    $end   = strtotime($endDate);
    if ($begin > $end) {
        echo "startdate is in the future! <br />";

        return 0;
    } else {
        $no_days  = 0;
        $weekends = 0;
        while ($begin <= $end) {
            $no_days++; // no of days in the given interval
            $what_day = date("N", $begin);
            if ($what_day > 5) { // 6 and 7 are weekend days
                $weekends++;
            };
            $begin += 86400; // +1 day
        };
        $working_days = $no_days - $weekends;

        return $working_days;
    }
}

, HTML:

<form method="post" id="Cform" name="Tform" action="diasuteis2.php">
    <label for="Cinsem">Data inicial:</label>
    <input type="date" name="Tinsem3" id="Cinsem" size="6">
    <label for="Cdesl22">Data final:</label>
    <input type="date" name="Tdesl" id="Cdesl22" size="6"><br><br>
    <p align="center">
    <input type="submit" id="enviar"></p>
</form>

примером правильного вывода :

echo $beginday;
echo "<br><br>";
echo $lastday;
echo "<br><br>";
echo $nr_work_days;

:

2014-12-10

2014-12-15

4

(Он считал, 10-й день, и удалил те дни, 13 и 14 правильно)

невозможно, или нецелесообразно, включать праздничные дни в этом коде? Если кто-то может сделать пример (конечно, не должны включать в себя все праздники, показать, как я могу это сделать) спасибо заранее.

 3
php
Author: Comunidade, 2015-05-05

2 answers

Здесь я Оставляю пример на количество праздничных дней. Внимание, что это не был протестирован, поэтому он может иметь некоторые ошибки.

function getWorkingDays($startDate, $endDate) {
    $begin = strtotime($startDate);
    $end   = strtotime($endDate);
    if ($begin > $end) {
        echo "startdate is in the future! <br />";
        return 0;
    }
    else {
        $holidays = array('01/01', '25/12', ...);
        $weekends = 0;
        $no_days = 0;
        $holidayCount = 0;
        while ($begin <= $end) {
            $no_days++; // no of days in the given interval
            if (in_array(date("d/m", $begin), $holidays)) {
                $holidayCount++;
            }
            $what_day = date("N", $begin);
            if ($what_day > 5) { // 6 and 7 are weekend days
                $weekends++;
            };
            $begin += 86400; // +1 day
        };
        $working_days = $no_days - $weekends - $holidayCount;

        return $working_days;
    }
}
 6
Author: Miguel Mesquita Alfaiate, 2015-05-05 15:17:41

Я Хотел бы добавить на праздничные дни:

    function dias_feriados($ano = null)
    {
        if ($ano === null)
        {
            $ano = intval(date('Y'));
        }

        $pascoa     = easter_date($ano); // Limite de 1970 ou após 2037 da easter_date PHP consulta http://www.php.net/manual/pt_BR/function.easter-date.php
        $dia_pascoa = date('j', $pascoa);
        $mes_pascoa = date('n', $pascoa);
        $ano_pascoa = date('Y', $pascoa);

        $feriados = array(
            // Tatas Fixas dos feriados Nacionail Basileiras
            mktime(0, 0, 0, 1,  1,   $ano), // Confraternização Universal - Lei nº 662, de 06/04/49
            mktime(0, 0, 0, 4,  21,  $ano), // Tiradentes - Lei nº 662, de 06/04/49
            mktime(0, 0, 0, 5,  1,   $ano), // Dia do Trabalhador - Lei nº 662, de 06/04/49
            mktime(0, 0, 0, 9,  7,   $ano), // Dia da Independência - Lei nº 662, de 06/04/49
            mktime(0, 0, 0, 10,  12, $ano), // N. S. Aparecida - Lei nº 6802, de 30/06/80
            mktime(0, 0, 0, 11,  2,  $ano), // Todos os santos - Lei nº 662, de 06/04/49
            mktime(0, 0, 0, 11, 15,  $ano), // Proclamação da republica - Lei nº 662, de 06/04/49
            mktime(0, 0, 0, 12, 25,  $ano), // Natal - Lei nº 662, de 06/04/49

            // These days have a date depending on easter
            mktime(0, 0, 0, $mes_pascoa, $dia_pascoa - 48,  $ano_pascoa),//2ºferia Carnaval
            mktime(0, 0, 0, $mes_pascoa, $dia_pascoa - 47,  $ano_pascoa),//3ºferia Carnaval 
            mktime(0, 0, 0, $mes_pascoa, $dia_pascoa - 2 ,  $ano_pascoa),//6ºfeira Santa  
            mktime(0, 0, 0, $mes_pascoa, $dia_pascoa     ,  $ano_pascoa),//Pascoa
            mktime(0, 0, 0, $mes_pascoa, $dia_pascoa + 60,  $ano_pascoa),//Corpus Cirist
        );

        sort($feriados);

        return $feriados;
    }

Указывает год и он создает МАССИВ с днями праздников. Кроме этого есть еще праздники муниципальных, которые должны были быть добавлены в МАССИВ. В частности, я поместил в базу данных праздники городские, потому что в команде есть люди, работая в различных местах.

Для отображения даты:

            $feriados = dias_feriados();
            $diaf = count($feriados);
            for ($x=0;$x<$diaf;$x++){
                echo '<p>'.date('Y-m-d',$feriados[$x]).'</p>';
            }   
 1
Author: Wellington Telles Cunha, 2018-06-11 22:54:59