Calculo de dias úteis entre duas datas em PHP

Publicado por Ricardo Herrero em 17/11/2010

[ Hits: 43.363 ]

 


Calculo de dias úteis entre duas datas em PHP



Olá amigos. Hoje gostaria de apresentar um código muito simples para cálculo de dias úteis.

Durante o desenvolvimento de alguns projetos, precisamos por vez calcular a diferença de dias entre duas datas. Abaixo iremos analisar um script que consegue efetuar este cálculo, considerando dias úteis.

Iniciamos criando algumas funções que irão nos ajudar neste trabalho.

Data-CalculoDiasUteis.PHP:

<?
//CALCULANDO DIAS NORMAIS
/*Abaixo vamos calcular a diferença entre duas datas. Fazemos uma reversão da maior sobre a menor
para não termos um resultado negativo. */

function CalculaDias($xDataInicial, $xDataFinal){
   $time1 = dataToTimestamp($xDataInicial);  
   $time2 = dataToTimestamp($xDataFinal);  

   $tMaior = $time1>$time2 ? $time1 : $time2;  
   $tMenor = $time1<$time2 ? $time1 : $time2;  

   $diff = $tMaior-$tMenor;  
   $numDias = $diff/86400; //86400 é o número de segundos que 1 dia possui  
   return $numDias;
}

//LISTA DE FERIADOS NO ANO
/*Abaixo criamos um array para registrar todos os feriados existentes durante o ano.*/

function Feriados($ano,$posicao){
   $dia = 86400;
   $datas = array();
   $datas['pascoa'] = easter_date($ano);
   $datas['sexta_santa'] = $datas['pascoa'] - (2 * $dia);
   $datas['carnaval'] = $datas['pascoa'] - (47 * $dia);
   $datas['corpus_cristi'] = $datas['pascoa'] + (60 * $dia);
   $feriados = array (
      '01/01',
      '02/02', // Navegantes
      date('d/m',$datas['carnaval']),
      date('d/m',$datas['sexta_santa']),
      date('d/m',$datas['pascoa']),
      '21/04',
      '01/05',
      date('d/m',$datas['corpus_cristi']),
      '20/09', // Revolução Farroupilha \m/
      '12/10',
      '02/11',
      '15/11',
      '25/12',
   );
  
return $feriados[$posicao]."/".$ano;
}      

//FORMATA COMO TIMESTAMP
/*Esta função é bem simples, e foi criada somente para nos ajudar a formatar a data já em formato  TimeStamp facilitando nossa soma de dias para uma data qualquer.*/

function dataToTimestamp($data){
   $ano = substr($data, 6,4);
   $mes = substr($data, 3,2);
   $dia = substr($data, 0,2);
return mktime(0, 0, 0, $mes, $dia, $ano);  
}

//SOMA 01 DIA  
function Soma1dia($data){  
   $ano = substr($data, 6,4);
   $mes = substr($data, 3,2);
   $dia = substr($data, 0,2);
return   date("d/m/Y", mktime(0, 0, 0, $mes, $dia+1, $ano));
}


//CALCULA DIAS UTEIS
/*É nesta função que faremos o calculo. Abaixo podemos ver que faremos o cálculo normal de dias ($calculoDias), após este cálculo, faremos a comparação de dia a dia, verificando se este dia é um sábado, domingo ou feriado e em qualquer destas condições iremos incrementar 1*/


function DiasUteis($yDataInicial,$yDataFinal){

   $diaFDS = 0; //dias não úteis(Sábado=6 Domingo=0)
   $calculoDias = CalculaDias($yDataInicial, $yDataFinal); //número de dias entre a data inicial e a final
   $diasUteis = 0;
  
   while($yDataInicial!=$yDataFinal){
      $diaSemana = date("w", dataToTimestamp($yDataInicial));
      if($diaSemana==0 || $diaSemana==6){
         //se SABADO OU DOMINGO, SOMA 01
         $diaFDS++;
      }else{
      //senão vemos se este dia é FERIADO
         for($i=0; $i<=12; $i++){
            if($yDataInicial==Feriados(date("Y"),$i)){
               $diaFDS++;  
            }
         }
      }
      $yDataInicial = Soma1dia($yDataInicial); //dia + 1
   }
return $calculoDias - $diaFDS;
}

?>  
<HTML>      
   <?  
   $DataInicial = "18/10/2010";
   $DataFinal = "27/10/2010";
  
   //CHAMADA DA FUNCAO
   $diasUteis = DiasUteis($DataInicial, $DataFinal);
   $diasNormal = CalculaDias($DataInicial, $DataFinal);
   ?>
  
   <BODY>
      <br />
      <?=$diasNormal?> dias entre <?=$DataInicial?> e <?=$DataFinal?>; <br />
      <?=$diasUteis?> dias úteis entre <?=$DataInicial?> e <?=$DataFinal?>; <br />
      
   </BODY>
</HTML>

Bem pessoal, é isso. Espero ter ajudado com a dica. Fico a disposição e aguardando comentários.

Para visualizar este código funcionando, use o link:
Também peço sugestão para novos tópicos.

Em breve estarei publicando um novo artigo que fará a soma de dias úteis em uma data.

Ricardo Herrero
Desenvolvedor web PHP

Outras dicas deste autor

Somar dias úteis em data - PHP

Leitura recomendada

Netbeans IDE 6.5 no Linux Ubuntu 8.10

Proxy Squid e Squidguard com integração full em Domain Controller

Criando notícias em RSS para seu site a partir de XML e MySQL

Inkscape realmente substitui o Corel Draw ou Illustrator?

Configurando rota para endereço multicast

  

Comentários
[1] Comentário enviado por inf17lnd em 23/03/2012 - 17:05h

Boa tarde!
Ótima essa função!
Gostaria de uma ajuda para adaptar que alem de considerar somente os dias úteis, ele tambem considere só as horas de trabalho
É possível??

Desde já agradeço

[2] Comentário enviado por bramax em 13/09/2013 - 23:43h

Valeu cara, bom trabalho com a função. Eu já estava usando algumas dessas funções para somar datas considerando dias úteis, agora fazendo o cálculo da diferença em dias úteis completou meu sistema =)

Abraço!

[3] Comentário enviado por michel15 em 02/06/2018 - 10:16h

Bom dia.

Criei minha conta só para agradecer por esse código.

Me ajudou muito!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts