germanosilva.dev

Como Calcular Dias Úteis em PHP

<?php

// Função para contar os dias úteis entre duas datas, considerando feriados
function countWorkingDays($startDate, $endDate, $holidays = []) {
    // Converte as datas fornecidas em objetos DateTime
    $start = new DateTime($startDate);
    $end = new DateTime($endDate);
    $end->modify('+1 day'); // Inclui a data final no cálculo

    // Define os feriados internacionais em formato 'Y-m-d'
    $internationalHolidays = [
        '01-01', // Ano Novo
        '12-25', // Natal
        '05-01', // Dia do Trabalho
        '08-15', // Assunção de Maria (exemplo)
        // Adicione mais feriados fixos aqui, se necessário
    ];

    // Calcula os feriados dinâmicos, como a Páscoa
    $year = $start->format('Y'); // Obtém o ano da data inicial
    $easter = date('m-d', easter_date($year)); // Calcula a data da Páscoa e a formata como 'm-d'

    // Adiciona a Páscoa e outros feriados dinâmicos à lista de feriados internacionais
    $internationalHolidays[] = $easter; // Domingo de Páscoa
    $internationalHolidays[] = calcularDataCarnaval($year); // Carnaval
    $internationalHolidays[] = calcularCorpusChristi($year); // Corpus Christi
    $internationalHolidays[] = date('m-d', strtotime('+1 day', strtotime($easter))); // Segunda-feira de Páscoa

    // Inicializa a contagem de dias úteis
    $workingDays = 0;

    // Loop através de cada data, do início ao fim
    while ($start < $end) {
        // Obtém o dia da semana atual (1 = Segunda-feira, 7 = Domingo)
        $dayOfWeek = $start->format('N');

        // Verifica se o dia é um dia útil (Segunda a Sexta-feira)
        if ($dayOfWeek < 6) {
            // Formata a data atual para 'Y-m-d'
            $currentDate = $start->format('Y-m-d');

            // Verifica se o dia não é um feriado internacional ou um feriado personalizado
            $currentMonthDay = $start->format('m-d'); // Obtém o mês e o dia da data atual
            if (!in_array($currentDate, $holidays) && !in_array($currentMonthDay, $internationalHolidays)) {
                $workingDays++; // Incrementa a contagem de dias úteis
            }
        }

        // Move para o próximo dia
        $start->modify('+1 day');
    }

    // Retorna o número total de dias úteis
    return $workingDays;
}

// Função para calcular a data do Carnaval em um determinado ano
function calcularDataCarnaval($ano) {
    // Calcula a data da Páscoa para o ano fornecido
    $dataPascoa = easter_date($ano);

    // Subtrai 47 dias da data da Páscoa para encontrar a data do Carnaval
    $dataCarnaval = strtotime('-47 days', $dataPascoa);

    // Retorna a data do Carnaval no formato 'm-d'
    return date('m-d', $dataCarnaval);
}

// Função para calcular a data de Corpus Christi em um determinado ano
function calcularCorpusChristi($ano) {
    // Calcula a data da Páscoa para o ano fornecido
    $dataPascoa = easter_date($ano);

    // Adiciona 60 dias à data da Páscoa para encontrar a data de Corpus Christi
    $dataCorpusChristi = strtotime('+60 days', $dataPascoa);

    // Retorna a data de Corpus Christi no formato 'm-d'
    return date('m-d', $dataCorpusChristi);
}

// Exemplo de uso da função countWorkingDays
$startDate = '2024-01-01'; // Data inicial
$endDate = '2024-12-31'; // Data final
$holidays = ['2024-12-24']; // Exemplo de feriado personalizado (Véspera de Natal)

$workingDays = countWorkingDays($startDate, $endDate, $holidays); // Chama a função para contar os dias úteis
echo "Number of working days: $workingDays"; // Exibe o número de dias úteis
?>

Explicação Geral do Código:

Este código define uma função chamada countWorkingDays, que calcula o número de dias úteis entre duas datas, levando em consideração os feriados personalizados e internacionais, incluindo feriados móveis como a Páscoa, o Carnaval e o Corpus Christi.

Componentes principais:

  1. Objetos DateTime: As datas inicial e final são convertidas em objetos DateTime para facilitar a manipulação de datas.
  2. Feriados Internacionais: Uma lista de feriados internacionais fixos (como Ano Novo e Natal) e móveis (como Páscoa e Corpus Christi) é definida e verificada durante a contagem dos dias úteis.
  3. Dias Úteis: A função percorre cada dia entre as datas fornecidas e incrementa a contagem de dias úteis somente se o dia não for fim de semana ou feriado.
  4. Funções Auxiliares: calcularDataCarnaval e calcularCorpusChristi são usadas para determinar as datas dos feriados móveis com base na data da Páscoa.

Uso:

No exemplo fornecido, a função é usada para calcular os dias úteis de 1º de janeiro de 2024 a 31 de dezembro de 2024, excluindo o dia 24 de dezembro (Véspera de Natal) como feriado personalizado. A função retornará e exibirá o número total de dias úteis no ano, considerando os feriados listados.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *