Calculo de dias úteis entre duas datas em PHP

Publicado por Ricardo Herrero em 17/11/2010

[ Hits: 38.065 ]

 


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

Como criar um atalho de navegação anônima no Chrome ou no Chromium

Instalando LMDE 2014

Erro ao tentar instalar Manjaro Linux [Resolvido]

Mapeando unidade de rede entre Windows e Linux

Instalando impressora Canon PIXMA iP1700

  

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