Autor Tópico: Calcular dias úteis entre datas  (Lida 1699 vezes)

GCONTABIL2015

  • Novato
  • *
  • Mensagens: 14
Re:Calcular dias úteis entre datas
« Responder #15 Online: Fevereiro 04, 2016, 04:48:52 pm »
Muito obrigado ao senhores Kleyber e Jean pelas valiosas ajudas e pelas funções...

Encontre também na net outra que estar dando certo, vou deixar aqui para os demais usuários do forum:

Código: [Selecionar]
<?php

// Define o formato de saída da data
define('FR_DATA''d/m/Y');

$dtfinal '09/02/2016';

// Teste

echo "O próximo dia util é : "proDiaUtil($dtfinal); 

/*
 * proDiaUtil()
 * Retorna o próximo dia útil em relação a data.
 *
 * @data   -> Variável que recebe a data. 
 *  Formato: DD/MM/AAAA
 */
function proDiaUtil($data)
{
// Separa a data
$dt explode('/'$data);
$dia $dt[0];
$mes $dt[1];
$ano $dt[2];
/*

(1) Pega uma data de referência (variável), compara com o datas definidas pelo sistema (feriados e finais de semana) 
e retorna a próxima data um dia útil
(2) As datas do sistema são: [1] sábados; [2] domingos; [3] feriados fixos; [4] feriados veriáveis; [5] dias opcionais (ex: quarta de cinza)
(3) Retorno o próximo/imediato dia útil.

*/

// 1 - verifica se a data referente é um final de semana (sábado ou domingo); 
// se sábado acrescenta mais 1 dia e faz nova verificação
// se domingo acrescenta mais 1 dia e faz nova verificação
$fsem date('D'mktime(0,0,0,$mes,$dia,$ano));
$i 1;
switch($fsem)
{
case 'Sat'
return proDiaUtil(date(FR_DATAmktime(0,0,0,$mes,$dia+$i,$ano))); 
break;

case 'Sun':
return proDiaUtil(date(FR_DATAmktime(0,0,0,$mes,$dia+$i,$ano)));
break;

default:
    // 2 - verifica se a data referente é um feriado
if(in_array($dataFeriados($ano))== true)
{
return proDiaUtil(date(FR_DATAmktime(0,0,0,$mes,$dia+$i,$ano)));
}
else
{
// Retorna o dia útil
return $data;
}
break;
}
}

/*
 * Feriados()
 * Gera um array com as datas dos feriados com referência no ano da data pesquisada.
 *
 * @ano   -> Variável que recebe o ano base para o cálculo;
 */
function Feriados($ano)
{

$feriados = array
(
  // Armazena feriados fíxos
  
  //Janeiro
  date(FR_DATAmktime(0,0,0,'01','01',$ano)), // 01/01 Ano novo
  date(FR_DATAmktime(0,0,0,'01','02',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'01','03',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'01','04',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'01','05',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'01','06',$ano)), //  Recesso
  
   //Março
  date(FR_DATAmktime(0,0,0,'03','19',$ano)), //  Dia de São José
  
   //Abril  
  date(FR_DATAmktime(0,0,0,'04','21',$ano)), // 21/04 Tiradentes
  
   //Maio
  date(FR_DATAmktime(0,0,0,'05','01',$ano)), // 01/05 Dia do trabalho
  
   //Junho
  date(FR_DATAmktime(0,0,0,'06','24',$ano)), //  São João
  
  //Julho
  date(FR_DATAmktime(0,0,0,'07','15',$ano)), //  N. Sa. Perpétuo Socorro
  
  //Setembro
  date(FR_DATAmktime(0,0,0,'09','07',$ano)), // 07/09 Independencia
  date(FR_DATAmktime(0,0,0,'09','28',$ano)), // Dia do Municipio de Acopiara
  
  //Outubro
  date(FR_DATAmktime(0,0,0,'10','04',$ano)), // São Francisco
  date(FR_DATAmktime(0,0,0,'10','12',$ano)), // 12/10 N. Senhora Aparecida
  
  
  //Novembro
  date(FR_DATAmktime(0,0,0,'11','02',$ano)), // 02/11 Finados   
  date(FR_DATAmktime(0,0,0,'11','15',$ano)), // 15/11 Proclamação
  
  //Dezembro
  date(FR_DATAmktime(0,0,0,'12','20',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','21',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','22',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','23',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','24',$ano)), // 24/12 Véspera de Natal
  date(FR_DATAmktime(0,0,0,'12','25',$ano)), // 25/12 Natal
  date(FR_DATAmktime(0,0,0,'12','26',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','27',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','28',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','29',$ano)), //  Recesso
  date(FR_DATAmktime(0,0,0,'12','30',$ano)), //  Recesso   
  date(FR_DATAmktime(0,0,0,'12','31',$ano)), // 31/12 Véspera de Ano novo
  
  
  // Armazena feriados variáveis
  //flxFeriado($ano, 'pascoa', $r = 1), // Páscoa - Sempre domingo
  flxFeriado($ano'carn_sab'$r 1), // Carnaval - Sempre sábado
  flxFeriado($ano'carn_dom'$r 1), // Carnaval - Sempre domingo
  flxFeriado($ano'carn_seg'$r 1), // Carnaval - Segunda
  flxFeriado($ano'carn_ter'$r 1), // Carnaval - Terça
  //strtoupper(flxFeriado($ano, 'carn_qua', $r = 1)), // Carnaval - Quarta de cinza
  flxFeriado($ano'sant_sex'$r 1), // Sexta Santa
  flxFeriado($ano'corp_chr'$r 1)  // Corpus Christi
);
return $feriados;
}

/*
 * flxFeriado()
 * Calcula os dias de feriados variáveis. Com base na páscoa.
 *
 * @ano   -> Variável que recebe o ano base para o cálculo;
 * @tipo  -> Tipo de dados
 *  [carn_sab]: Sábado de carnaval;
 *  [carn_dom]: Domingo de carnaval;
 *  [carn_seg]: Segunda-feira de carnaval;
 *  [carn_ter]: Terça-feira de carnaval;
 *  [carn_qua]: Quarta-feira de carnaval;
 *  [sant_sex]: Sexta-feira santa;
 *  [corp_chr]: Corpus Christi;
 */
 
function flxFeriado($ano$tipo NULL)
{
$a=explode("/"calPascoa($ano));
switch($tipo)
{
case 'carn_sab'$d $a[0]-50; break;
case 'carn_dom'$d $a[0]-49; break;
case 'carn_seg'$d $a[0]-48; break;
case 'carn_ter'$d $a[0]-47; break;
case 'carn_qua'$d $a[0]-46; break;
case 'sant_sex'$d $a[0]-2; break;
case 'corp_chr'$d $a[0]+60; break;
case NULL
case 'pascoa'$d $a[0]; break;
}
return date(FR_DATAmktime(0,0,0,$a[1],$d,$a[2])); break;
}

/*
 * calPascoa()
 * Calcula o domingo da pascoa. Base para todos os feriádos móveis.
 *
 * @ano   -> Variável que recebe o ano base para o cálculo ;
 */
 
function calPascoa($ano)
{
$A = ($ano 19);
    
$B = (int)($ano 100);
    
$C = ($ano 100);
    
$D = (int)($B 4);
    
$E = ($B 4);
    
$F = (int)(($B 8) / 25);
    
$G = (int)(($B $F 1) / 3);
    
$H = ((19 $A $B $D $G 15) % 30);
    
$I = (int)($C 4);
    
$K = ($C 4);
    
$L = ((32 $E $I $H $K) % 7);
    
$M = (int)(($A 11 $H 22 $L) / 451);
    
$P = (int)(($H $L $M 114) / 31);
    
$Q = (($H $L $M 114) % 31) + 1;
    return 
date('d/m/Y'mktime(0,0,0,$P,$Q,$ano));
}

?>


Kleyber

  • Expert
  • *****
  • Mensagens: 2235
    • Email
Re:Calcular dias úteis entre datas
« Responder #16 Online: Fevereiro 04, 2016, 05:02:22 pm »
Que bom que resolveu, Gilson. E obrigado por compartilhar o código. Vai ser útil sim.
Kleyber Derick

ITIL® V3 Foundation Certified
Analista de Sistemas
São Luís - Maranhão
www.tkinformidia.net

Jean Matos

  • Expert
  • *****
  • Mensagens: 956
    • Gestão de Construtoras
    • Email
Re:Calcular dias úteis entre datas
« Responder #17 Online: Fevereiro 04, 2016, 05:19:27 pm »
E ainda fala que não sabe programar nos webnar...... kkkkk
Parabéns Jean.
na verdade sou um exper em pesquisar....
achei o script na net, porém fiz algumas adaptações.....
Sc - 6.xxx , 7.xxx e V8
Windows Server 2008 Enterpriser 64 bits
SqlServer 2008 Express 64 bits
Sistema Integrado de Gestão de Construtoras]WaveTOR - Sistema Integrado de Gestão de Construtoras
Teófilo Otoni - MG
(33)8824-2775

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Calcular dias úteis entre datas
« Responder #18 Online: Fevereiro 05, 2016, 08:16:31 am »
Jean chic.
Só tenho uma observação a fazer.
Tem um bug na sua assinatura onde você fecha a "]" não encontrei onde você abriu a chave.
Ai fiquei sem saber direito sua especialidade.
kkkkkkkkk

Celso R.
________________________________
SC - V 8

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Calcular dias úteis entre datas
« Responder #19 Online: Fevereiro 05, 2016, 08:16:59 am »
Caro GCONTABIL2015 Todo código compartilhado é válido.
Obrigado por compartilhar.
Celso R.
________________________________
SC - V 8

GCONTABIL2015

  • Novato
  • *
  • Mensagens: 14
Re:Calcular dias úteis entre datas
« Responder #20 Online: Fevereiro 12, 2016, 10:57:26 am »
Obrigado a todos pela valiosa ajuda.

Cleidson dos Santos

  • Intermediário
  • ***
  • Mensagens: 173
    • Sistema para controle e Gerenciamento de Manutenção
    • Email
Re:Calcular dias úteis entre datas
« Responder #21 Online: Fevereiro 12, 2016, 02:55:22 pm »
Acho que isso atende ao que você precisa.
Você pode copiar este código e executá-lo em uma blank para ajustar ao que precisa.

//DATA INICIAL
   $data_1='2016-02-09';
   //INCREMENTO DE DIAS A DATA INICIAL
   $add_dias=80;
   //CONTADOR DE FERIADOS
   $contador=0;
   //ARRAY COM FERIADOS
   $feriados_array = array('2016-01-01', '2016-02-09', '2016-03-25', '2016-03-27', '2016-04-25',
                      '2016-26-01', '2016-05-26', '2016-06-10', '2016-06-13');
   //TRATAMENTO DA DATA FINAL
   $data_2=date_create($data_1);
   date_add($data_2,date_interval_create_from_date_string("$add_dias day"));
   $data_2=date_format($data_2,"Y-m-d");

//LAÇO DE REPETIÇÃO DE INCREMENTO E COMPARAÇÃO ENTRE DATAS
while($data_1 < $data_2){

   if (in_array($data_1, $feriados_array)) {
      $contador++;
   }
   //TRATAMENTO E INCREMENTO DA DATA INICIAL
   $data_1=date_create($data_1);
   date_add($data_1,date_interval_create_from_date_string("1 day"));
   $data_1=date_format($data_1,"Y-m-d");

}
   $data_2=date_create($data_2);
   date_add($data_2,date_interval_create_from_date_string("-$contador day"));
   $data_2=date_format($data_2,"Y-m-d");

echo 'DATA DO AGENDAMENTO = '.$data_1.' - '.$contador.' DIA<br />';
echo 'DATA DO AGENDAMENTO = '.$data_2.'<br />';
« Última modificação: Fevereiro 12, 2016, 03:11:13 pm por Cleidson dos Santos »
Cleidson dos Santos
cleidsoncarneirodossantos@gmail.com
Skype: cleidson_santos1
WhatsApp: (15) 99635-4862