Ciao a tutti volevo sapere se esiste una funzione che mi permetta:
data una data d'inizio e un numero di giorni lavorativi
di ricavare la data finale (data inizio + giorni lavorativi).
Grazie![]()
Ciao a tutti volevo sapere se esiste una funzione che mi permetta:
data una data d'inizio e un numero di giorni lavorativi
di ricavare la data finale (data inizio + giorni lavorativi).
Grazie![]()
uhm, sarebbe un po' complicatuccio.. xkè bisogna considerare che la data d'inizio, potrebbe anche essere un giovedì, quindi i calcoli sballerebbero... nn so, ci sarà qualche calcolo complicato da fare a parer mio...
$data = "15/04/2006";
$giorni = 35;
se questi fossero i dati di imput della funzione potresti procedere in questo modo, dando per scontato che i giorni lavorativi li consideri 5 a settimana ma potresti mettere anche un parametro aggiuntivo alla funzione con valore predefinito = a 5
$settimane = intval($giorni/5);
quindi con mktime puoi aggiungere il numero di settimane che ti risulta, poi ti manca da sommare
$giorni_mancanti = $giorni%5;
e il numero di feste comprese tra la data iniziale e la data trovata con mktime
per questo devi fare un ciclo che valuta giorno giorno se è una data da considerare valida tenendo presente anche le feste
ciao
Ciao. Questa è la mia soluzione. Da premettere che per giorni lavorativi considera solo il sabato e la domenica, non le festività.
E' un pò contorta ma funzionante.
Codice PHP:
<?php
$dataInizio = mktime(0,0,0,4,19,2006);
$giorni = 9;
$dataFine = $dataInizio;
$i = 1;
while($i<=$giorni )
{
$data = date("w",$dataFine);
if ($data != 0 && $data !=6)
{
$i++;
}
$dataFine = $dataFine+86400;
}
$dataFine = $dataFine-86400;
echo date("d-m-Y",$dataFine);
?>
edit: avevo postato una funzione dal manuale ufficiale ma non generava il risultato che volevi. Appena posso lo guardo con calma. Per adesso accontentati.![]()
Ciao. Questo è il mio script per il tuo problema. Restituisce la data finale data quella di partenza e il numero di giorni lavorativi. Tiene conto delle festività. Ho fatto un pò di prove e mi sembra funzioni correttamente.
Sicuramente si può scrivere meglio quindi sono ben accetti consigli.
Codice PHP:
<?php
// Calcolo del giorno di Pasqua fino all'ultimo anno valido
for ($i=2006; $i<=2037; $i++)
{
$pasqua = date("Y-m-d", easter_date($i));
$array_pasqua[] = $pasqua;
}
//var_dump($array_pasqua);
// Calcolo le rispettive pasquette
foreach($array_pasqua as $pasqua)
{
list ($anno,$mese,$giorno) = explode("-",$pasqua);
$pasquetta = mktime (0,0,0,date($mese),date($giorno)+1,date($anno));
$array_pasquetta[] = $pasquetta;
}
// Data da cui calcolare i giorni lavorativi
$giorno = 8;
$mese = 12;
$anno = 2006;
// Numero giorni lavorativi
$lavorativi = 15;
// Mi calcolo il timestamp della mia data di partenza
$tsData = mktime(0,0,0,$mese,$giorno,$anno);
// questi giorni son sempre festivi a prescindere dall'anno
$giorniFestivi = array("01-01",
"01-06",
"04-25",
"05-01",
"06-02",
"08-15",
"11-01",
"12-08",
"12-25",
"12-26",
);
$i = 0;
while ($i<$lavorativi)
{
$giorno_data = date("w",$tsData); //verifico il giorno: da 0 (dom) a 6 (sab)
$mese_giorno = date('m-d',$tsData); // confronto con gg sempre festivi
// Infine verifico che il giorno non sia sabato,domenica,festivo fisso o festivo variabile (pasquetta);
if ($giorno_data !=0 && $giorno_data != 6 && !in_array($mese_giorno,$giorniFestivi) && !in_array($tsData,$array_pasquetta) )
{
$i++;
}
$tsData=$tsData+86400;
}
$tsData=$tsData-86400;
$giorno_conclusivo = date('d-m-Y',$tsData);
echo $giorno_conclusivo;
?>
Ops. E' vero.Originariamente inviato da luca200
Hai dimenticato il 2 giugno![]()
![]()
Ora provvedo.![]()
...e se per esempio io volessi attribuire ai sabati mezza giornata lavorativa?
:master:
Ho la sindrome di Peter Pan, le manie di persecuzione...se sapessi suonare uno strumento sicuramente avrei anche un complesso.
questo il mio contributo....
puoi estrarre le ore, il totale dei giorni e relative date, nonchè le date festive
accetta le date in formato italiano (gg-mm-aaaa) e le restiotuisce in italiano..
nel caso in cui volessi sapere, ad esempio la data di fine conoscendo il numero dei giorni e la data di partenza (esempio stima dell' apertura di un cantiere)
Codice PHP:
$my_giorni=200;
$myinizio ='12-02-2009';
// diamoci una data superiore ai giorni lavorativi giusto per starci dentro
$myfine ='12-02-2010';
$date_termine=lavorativi($myinizio,$myfine,'date');
$data_finale=$date_termine[$my_giorni];
echo $data_finale."
";
![]()
Codice PHP:
<?php
$myinizio='2-3-2008';
$myfine='2-3-2009';
$ore_lavorative = lavorativi($myinizio,$myfine,'ore');
$giorni_lavorativi = lavorativi($myinizio,$myfine,'giorni');
$date_lavorative = lavorativi($myinizio,$myfine,'date');
$feste = lavorativi($myinizio,$myfine,'festivita');
echo "le ore lavorative sono $ore_lavorative
";
echo "i giorni lavorativi sono $giorni_lavorativi
";
echo "elenco festività
";
echo "<pre>";
print_r($feste);
echo "elenco date
";
echo "<pre>";
print_r($date_lavorative);
function lavorativi($from,$to,$cosa)
{
$ore=0;
$giorni=0;
$date=array();
$festivita=array();
//giorno della settimana => ore lavorative
$lavorativi = array(1=>8,2=>8,3=>8,4=>8,5=>8,6=>4,7=>0);
$festivi=array(
"01-01",
"06-01",
"25-04",
"08-05",
"02-06",
"15-08",
"01-11",
"08-12",
"24-12",
"25-12",
"26-12",
);
list($d_start,$m_start,$y_start)=explode('-',$from);
list($d_stop,$m_stop,$y_stop)=explode('-',$to);
$start=strtotime("$y_start-$m_start-$d_start");
$stop=strtotime("$y_stop-$m_stop-$d_stop");
$day=$start;
while($day <= $stop)
{
list($day_of_week,
$ita_date,
$confronto_festivo,
$giorno_pasquale)=explode('__',date('N__d-m-Y__d-m__Y',$day));
if ( ($day_of_week != 7) && !in_array($confronto_festivo,$festivi) && $day != easter_date($giorno_pasquale) )
{
$ore+=$lavorativi[$day_of_week];
$giorni++;
$date[]=$ita_date;
}
else
{
$festivita[]=$ita_date;
}
$day+=86400;
}
return $$cosa;
}
?>
Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle
il mio profilo su PHPClasses e il mio blog laboweb