Olá amigos.
Vamos fazer um novo exercício com datas, agora somando dias úteis em uma determinada data.
Vou utilizar as mesmas bibliotecas que usamos para a dica anterior:
Cálculo de dias úteis entre duas datas em PHP
Bem, vamos direto aos códigos. Neste exemplo vamos criar algumas funções que vão facilitar nosso trabalho.
Descritivo das funções:
<?
//FORMATA COMO TIMESTAMP
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);
}
?>
Esta função irá transformar a data que iremos utilizar, conforme padrão mktime.
<?
//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));
}
?>
Esta função efetua a soma de um dia para uma data qualquer.
<?
//LISTA DE FERIADOS NO 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;
}
?>
Vamos registrar todos os possíveis feriados dentro deste array.
Vocês podem perceber que temos datas de feriados fixos, por exemplo, o natal que é sempre no dia 25 de dezembro e também temos feriados como a páscoa, que precisamos fazer um cálculo para descobrirmos o dia certo do feriado.
Com estas 03 funções acima conseguiremos efetuar a nossa soma de dias úteis.
Segue abaixo a função que fará esta soma:
<?
function SomaDiasUteis($xDataInicial,$xSomarDias){
for($ii=1; $ii<=$xSomarDias; $ii++){
$xDataInicial=Soma1dia($xDataInicial); //SOMA DIA NORMAL
//VERIFICANDO SE EH DIA DE TRABALHO
if(date("w", dataToTimestamp($xDataInicial))=="0"){
//SE DIA FOR DOMINGO OU FERIADO, SOMA +1
$xDataInicial=Soma1dia($xDataInicial);
}else if(date("w", dataToTimestamp($xDataInicial))=="6"){
//SE DIA FOR SABADO, SOMA +2
$xDataInicial=Soma1dia($xDataInicial);
$xDataInicial=Soma1dia($xDataInicial);
}else{
//senaum vemos se este dia eh FERIADO
for($i=0; $i<=12; $i++){
if($xDataInicial==Feriados(date("Y"),$i)){
$xDataInicial=Soma1dia($xDataInicial);
}
}
}
}
return $xDataInicial;
}
?>
Iremos fazer uma verificação dia-a-dia para saber se o dia é útil.
Através da função PHP date, utilizamos o parâmetro w que irá retornar o valor 6 para sábado ou 0 para domingo. Caso esta informação seja falsa, conferimos se a data não é um feriado.
Para efetuarmos a chamada da função que realiza a soma, basta executar a função SomaDiasUteis(a,b), conforme exemplo abaixo.
Desejamos somar 02 dias úteis a partir da data de hoje:
<?= SomaDiasUteis(date("d/m/Y"),5)?>
Galera, é isso. Espero ter ajudado com este código.
Fico no aguardo dos comentários e sugestões para os próximos.
Para visualizar este código funcionando, use o link:
Em breve estarei publicando uma biblioteca que utilizo para efetuar upload de imagem.
Ricardo Herrero
Desenvolvedor web PHP
Abaixo segue o código completo.
Data-SomaDiasUteis.PHP:
<?
//CALCULANDO DIAS NORMAIS
//LISTA DE FERIADOS NO 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
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));
}
function SomaDiasUteis($xDataInicial,$xSomarDias){
for($ii=1; $ii<=$xSomarDias; $ii++){
$xDataInicial=Soma1dia($xDataInicial); //SOMA DIA NORMAL
//VERIFICANDO SE EH DIA DE TRABALHO
if(date("w", dataToTimestamp($xDataInicial))=="0"){
//SE DIA FOR DOMINGO OU FERIADO, SOMA +1
$xDataInicial=Soma1dia($xDataInicial);
}else if(date("w", dataToTimestamp($xDataInicial))=="6"){
//SE DIA FOR SABADO, SOMA +2
$xDataInicial=Soma1dia($xDataInicial);
$xDataInicial=Soma1dia($xDataInicial);
}else{
//senaum vemos se este dia eh FERIADO
for($i=0; $i<=12; $i++){
if($xDataInicial==Feriados(date("Y"),$i)){
$xDataInicial=Soma1dia($xDataInicial);
}
}
}
}
return $xDataInicial;
}
?>
<HTML>
<?
$DataInicial = "04/08/2010";
$QtdDia = 8;
$diasSomados = SomaDiasUteis($DataInicial,$QtdDia);
?>
<BODY>
<br />
Somar <?=$QtdDia?> dia(s) de <?=$DataInicial?> = Resultado: <?=$diasSomados?> ?>
</BODY>
</HTML>