<?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:
- Objetos DateTime: As datas inicial e final são convertidas em objetos
DateTime
para facilitar a manipulação de datas. - 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.
- 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.
- Funções Auxiliares:
calcularDataCarnaval
ecalcularCorpusChristi
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