Calculo de data

Boa tarde!

Minha duvida é, como faço para realizar o calculo de datas ?

Por exemplo :

Quero calcular até que dia do mês (09/12/2016) vai o prazo de 10 dias UTEIS (Se não me engano vai até dia 23/12/2016).

Se tem alguma maneira de automatizar isso. Pois quero utilizar em condições, como, IF (se).

[size=14pt]http://php.net/manual/en/ref.datetime.php[/size]

Meu presente de Natal para o Forum:


<?php
//by Haroldo Passos 26/01/2004

function getDiaDaSemana($timestamp)
{ 
	$timestamp = strtotime($timestamp); 
	$date = getdate($timestamp); 
	$diaSemana = $date['weekday']; 
	if(preg_match('/(sunday|domingo)/mi',$diaSemana)) $diaSemana = 'Domingo'; 
	else if(preg_match('/(monday|segunda)/mi',$diaSemana)) $diaSemana = 'Segunda'; 
	else if(preg_match('/(tuesday|terça)/mi',$diaSemana)) $diaSemana = 'Terça'; 
	else if(preg_match('/(wednesday|quarta)/mi',$diaSemana)) $diaSemana = 'Quarta'; 
	else if(preg_match('/(thursday|quinta)/mi',$diaSemana)) $diaSemana = 'Quinta'; 
	else if(preg_match('/(friday|sexta)/mi',$diaSemana)) $diaSemana = 'Sexta'; 
	else if(preg_match('/(saturday|sábado)/mi',$diaSemana)) $diaSemana = 'Sábado'; 
	return $diaSemana; 
}

function vencimento($data,$DIAS_PGTO=0)
{ 
	$data = date('Y-m-d', strtotime($data. '+ '.$DIAS_PGTO.' days')); 
 	if(getDiaDaSemana($data)==("Sábado"))
	{ 
	 	$data = date('Y-m-d', strtotime($data. ' + 2 days')); 
 	}
 	else if(getDiaDaSemana($data)==("Domingo"))
	{ 
		$data = date('Y-m-d', strtotime($data. '+ 1 days')); 
	} 
 	return $data; 
}

function Dia_Util($data,$DIAS_PGTO=0)
{ 
	$feriados=Feriados(date('Y',strtotime($data)));
	$dutil=FALSE;
	while (!$dutil) {
    	$data=vencimento($data,$DIAS_PGTO);
		if (array_value_recursive($data, $feriados) <> NULL)
		{
			$data = date('Y-m-d', strtotime($data. '+ 1 days')); 
			$data=vencimento($data,$DIAS_PGTO);
		}else{
			$dutil=TRUE;	
		}
	} 
 	return $data; 
}


function DataPascoa($Ano)  {
	$Rest =($Ano % 19)+1;
  switch ($Rest) {
    case 1: $Dia = mktime(0,0,0, 4, 14, $Ano); break;
    case 2: $Dia = mktime(0,0,0, 4, 3, $Ano); break;
    case 3: $Dia = mktime(0,0,0, 3, 23, $Ano); break;
    case 4: $Dia = mktime(0,0,0, 4, 11, $Ano); break;
    case 5: $Dia = mktime(0,0,0, 3, 31, $Ano); break;
    case 6: $Dia = mktime(0,0,0, 4, 18, $Ano); break;
    case 7: $Dia = mktime(0,0,0, 4, 8, $Ano); break;
    case 8: $Dia = mktime(0,0,0, 3, 28, $Ano); break;
    case 9: $Dia = mktime(0,0,0, 4, 16, $Ano); break;
    case 10: $Dia = mktime(0,0,0, 4, 5, $Ano); break;
    case 11: $Dia = mktime(0,0,0, 3, 25, $Ano); break;
    case 12: $Dia = mktime(0,0,0, 4, 13, $Ano); break;
    case 13: $Dia = mktime(0,0,0, 4, 2, $Ano); break;
    case 14: $Dia = mktime(0,0,0, 3, 22, $Ano); break;
    case 15: $Dia = mktime(0,0,0, 4, 10, $Ano); break;
    case 16: $Dia = mktime(0,0,0, 3, 30, $Ano); break;
    case 17: $Dia = mktime(0,0,0, 4, 17, $Ano); break;
    case 18: $Dia = mktime(0,0,0, 4, 7, $Ano); break;
    case 19: $Dia = mktime(0,0,0, 3, 27, $Ano); break;
  }
  $Ret = "";
  for ($n=1; $n<=13; $n++) {
    $Dia+=86400;

    if (date('l',$Dia)=="Sunday"){
       	$dd = date('d',$Dia);
		$mm = date('m',$Dia);
        return date('Y-m-d',$Dia);
    }
  }
  return "";
}

Function Feriados($ano)
{
	$feriados[$ano.'-01-01']='Confraternização Universal';
	$feriados[$ano.'-04-21']='Tiradentes';
	$feriados[$ano.'-05-01']='Dia do Trabalho';
	$feriados[$ano.'-09-07']='Proclamação da Independência';
	$feriados[$ano.'-10-12']='Nossa Srª Aparecida';
	$feriados[$ano.'-11-02']='Finados';
	$feriados[$ano.'-11-15']='Proclamação da República';
	$feriados[$ano.'-12-25']='Natal';
	
	$pascoa=DataPascoa($ano);
	
	$feriados[date('Y-m-d', strtotime($pascoa. ' - 48 days'))]='Segunda de Carnaval';
	$feriados[date('Y-m-d', strtotime($pascoa. ' - 47 days'))]='Terça de Carnaval';
	$feriados[date('Y-m-d', strtotime($pascoa. ' - 2 days'))]='Sexta-Feira da Paixão';
	$feriados[$pascoa]='Páscoa';
	$feriados[date('Y-m-d', strtotime($pascoa. ' + 60 days'))]='Corpus Christi';
	
	Return $feriados;
	
}

function array_value_recursive($key, array $arr){
    $val = array();
    array_walk_recursive($arr, function($v, $k) use($key, &$val){
        if($k == $key) array_push($val, $v);
    });
    return count($val) > 1 ? $val : array_pop($val);
}
?>

crie uma biblioteca externa

sc_include_library("sys", "myLibs", "php/DiaUtil.php");

echo  "<pre>".print_r(feriados(2017),true)."</pre>";

echo "<pre> sexta santa '2017-04-14' prox dia util->". Dia_Util('2017-04-14')."  ".getDiaDaSemana(Dia_Util('2017-04-14'))."</pre>"; 

echo "<pre> sabado de carnaval '2017-02-25' prox dia util->". Dia_Util('2017-02-25')."  ".getDiaDaSemana(Dia_Util('2017-02-25'))."</pre>"; 

echo "<pre> confraternização '2017-01-01' prox dia util->". Dia_Util('2017-01-01')."  ".getDiaDaSemana(Dia_Util('2017-01-01'))."</pre>"; 

echo "<pre> um sabado '2017-01-07' prox dia util->". Dia_Util('2017-01-07')."  ".getDiaDaSemana(Dia_Util('2017-01-07'))."</pre>"; 

echo "<pre> dia comum '2017-03-15' prox dia util->". Dia_Util('2017-03-15')."  ".getDiaDaSemana(Dia_Util('2017-03-15'))."</pre>"; 

https://infinitusweb.net.br/sige/teste_feriados/

TAGS= BIBLIOTECA, EXTERNA, DATA, DIAS, UTIL, VENCIMENTO, FERIADOS, SEM TABELA

Grato, Haroldo Noel por compartilhar.

1 Curtida

Muito obrigado esta biblioteca caiu que nem uma luva para meu projeto!!

1 Curtida

É legal ver um colega que fez uma pesquisa aqui e encontrou logo de cara o que buscava.

Por isso sempre faço questão de atribuir ao texto palavras chave para facilitar a busca.

Esse fórum é uma grande base de conhecimento. Não só de scriptcase, pois essas postagens são constantemente acessadas com pesquisas direto dos motores de busca do Google.

Me lembro quando trabalhei nessas rotinas. Tive que estudar como funcionavam os feriados no Brasil, pelo fato de alguns não caírem em dias fixos.

Hoje utilizo rotinas direto no banco de dados.

2 Curtidas