Bonjour à tous,
J'essaye de faire un formulaire de congés qui calcule le nombre de jours ouvrés entre deux dates données en paramètre puis coverties en timestamp.
Le calcul se fait bien mais j'ai un problème de performance important, pour une différence de date de 8-9 jours, le parcours dans ma boucle se fait au moins 300-400 fois et je ne comprends pas pourquoi. Ca doit être un petit truc mais je sèche.
Merci à tous ceux qui me viendront en aide :)
<?
// Retourne le nombre de jours en secondes au total (1 jour = 86 400 secondes)
function NbJours($date_debut, $date_fin) {
$tDeb = explode("/", $date_debut);
$tFin = explode("/", $date_fin);
$diff = mktime(0, 0, 0, $tFin[1], $tFin[0], $tFin[2]) -
mktime(0, 0, 0, $tDeb[1], $tDeb[0], $tDeb[2]);
return(($diff / 86400)+1);
}
// Va retourner le nombre de jours au total - les jours féries
function jour_ferie($timestampStart, $timestampEnd){
$jour = date("d", $timestampStart);
$mois = date("m", $timestampStart);
$annee = date("Y", $timestampStart);
//echo $jour." ".$mois." ".$annee."<br />";
$nbFerie = 0;
while ($timestampStart <= $timestampEnd) // PROBLEME SUR CETTE BOUCLE
{
// Définition des dates fériées fixes
if($jour == 01 && $mois == 01) $nbFerie++; // 1er janvier
if($jour == 01 && $mois == 05) $nbFerie++; // 1er mai
if($jour == 08 && $mois == 05) $nbFerie++; // 8 mai
if($jour == 14 && $mois == 07) $nbFerie++; // 14 juillet
if($jour == 15 && $mois == 8) $nbFerie++; // 15 aout
if($jour == 01 && $mois == 11) $nbFerie++; // 1 novembre
if($jour == 11 && $mois == 11) $nbFerie++; // 11 novembre
if($jour == 25 && $mois == 12) $nbFerie++; // 25 décembre
// Calcul du jour de pâques
$date_paques = easter_date($annee);
$jour_paques = date("d", $date_paques);
$mois_paques = date("m", $date_paques);
if($jour_paques == $jour && $mois_paques == $mois) $nbFerie++;
// Pâques
// Calcul du jour de l ascension (38 jours après Paques)
$date_ascension = mktime(date("H", $date_paques),
date("i", $date_paques),
date("s", $date_paques),
date("m", $date_paques),
date("d", $date_paques) + 39,
date("Y", $date_paques)
);
$jour_ascension = date("d", $date_ascension);
$mois_ascension = date("m", $date_ascension);
if($jour_ascension == $jour && $mois_ascension == $mois) $nbFerie++;
//Ascension
// Calul des samedis et dimanches
$jour_julien = unixtojd($timestampStart);
$jour_semaine = jddayofweek($jour_julien, 0);
if($jour_semaine == 0 || $jour_semaine == 6) $nbFerie++;
//Samedi (6) et dimanche (0)
// Incrémentation du nombre de jour ( on avance dans la boucle)
$jour++;
$timestampStart=mktime(0,0,0,$mois,$jour,$annee);
$nbJour = ($timestampEnd - $timestampStart / (60*60*24));
$nbJourOuvrable = $nbJour - jour_ferie($timestampStart,$timestampEnd);
}
return $nbFerie;
}//Fin de la fonction
// Calcul de la différence de date
$date_debutCE = "15/08/2007" ;
$date_finCE = "27/08/2007" ;
$totce = NbJours($date_debutCE, $date_finCE);
// Pour le comptage des jours ouvrés
$tDeb = explode("/", $date_debutCE);
$tFin = explode("/", $date_finCE);
$timestampEnd = mktime(0, 0, 0, $tFin[1], $tFin[0], $tFin[2]);
$timestampStart = mktime(0, 0, 0, $tDeb[1], $tDeb[0], $tDeb[2]);
jour_ferie($timestampStart, $timestampEnd);
$testce = $totce - jour_ferie($timestampStart, $timestampEnd) ;
$today = date("d/m/Y");
$totjource = 'jours';
if($date_debutCE == $date_finCE){ $testce = 1;}
if ($testce == 1) ($totjource = 'jour');
echo $testce." ".$totjource;
?>