Bon je rééxplique mon probleme. Je choisi une date de depart et une date d'arrivée (demande de congés) je dois calculer le nombre de jours ouvrables pendant cette periode.
Alors dans ma page j ai ca :
<?
// Test d'existence de la date de debut sinon date du jour
if (!isset ($JourDeb) || $JourDeb == "") $JourDeb = date('d');
if (!isset ($MoisDeb) || $MoisDeb == "") $MoisDeb = date('m');
if (!isset ($AnneeDeb) || $AnneeDeb == "") $AnneeDeb = date('Y');
$timestamp_depart = mktime(0, 0, 0, $MoisDeb, $JourDeb, $AnneeDeb);
$timestamp_depart_heure = mktime($heureDepart, $minDepart, 0, $MoisDeb, $JourDeb, $AnneeDeb);
// Test d'existence de la date de fin sinon date du jour +1
$TimeFin = strtotime ("now") + 86400; // 86400 = 24 * 60 * 60 = 1 jour
if (!isset ($JourFin) || $JourFin == "") $JourFin = date('d', $TimeFin);
if (!isset ($MoisFin) || $MoisFin == "") $MoisFin = date('m', $TimeFin);
if (!isset ($AnneeFin) || $AnneeFin == "") $AnneeFin = date('Y', $TimeFin);
$timestamp_retour = mktime(0, 0, 0, $MoisFin, $JourFin, $AnneeFin);
$timestamp_retour_heure = mktime($heureRetour, $minRetour, 0, $MoisFin, $JourFin, $AnneeFin);
// Calcul du nombre de jours dans le mois
$NbrJourDuMoisDeb = date ('t', mktime (0, 0, 0, $MoisDeb, 1, $AnneeDeb));
$NbrJourDuMoisFin = date ('t', mktime (0, 0, 0, $MoisFin, 1, $AnneeFin));
// Constantes navigation de date
$AnneeInf = strftime ("%Y") - 1;
$AnneeSup = strftime ("%Y") + 5;
$nbJour = ($timestamp_retour-$timestamp_depart)/(60*60*24);// 86400 = 24 * 60 * 60 = 1 jour
$nbJourOuvrable = $nbJour - jour_ferie($timestamp_depart,$timestamp_retour);
?>
et ma fonction de calcul de jours fériés (toujours la même) :
<?
// SERVANT AU CALCUL DES JOURS OUVRABLES
// Fonction retournant le nombre de jour fériés samedis et
// dimanches entre 2 dates entrées en timestamp
function jour_ferie($timestampStart, $timestampEnd)
{
// Initialisation de la date de début
$jour = date("d", $timestampStart);
$mois = date("m", $timestampStart);
$annee = date("Y", $timestampStart);
$nbFerie = 0;
while ($timestampStart <= $timestampEnd)
{
// Définition des dates fériées fixes
if($jour == 1 && $mois == 1) $nbFerie++; // 1er janvier
if($jour == 1 && $mois == 5) $nbFerie++; // 1er mai
if($jour == 8 && $mois == 5) $nbFerie++; // 5 mai
if($jour == 14 && $mois == 7) $nbFerie++; // 14 juillet
if($jour == 15 && $mois == 8) $nbFerie++; // 15 aout
if($jour == 1 && $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 (39 jours après Paques)
$date_ascension = mktime(
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
// Calcul de Pentecôte (11 jours après Ascension)
$date_pentecote = mktime(
date("m", $date_ascension),
date("d", $date_ascension) + 11,
date("Y", $date_ascension)
);
$jour_pentecote = date("d", $date_pentecote);
$mois_pentecote = date("m", $date_pentecote);
if($jour_pentecote == $jour && $mois_pentecote == $mois) $nbFerie++;
//Pentecote
// 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);
}
return $nbFerie;
}//Fin de la fonction
?>
... Pour résumer je trouve des erreurs de calcul. En fait je pense que ca vient des années bisextiles. ai utilisé un floor pour arrondir mais le probleme c'est que sur une difference de plusieurs années la fonctions zappe des jours.
De plus je crois que la fonction deconne également sur le passage d'un mois à l'autre. Genre du 31/07/2005 au 01/08/2005 je trouve 0 jours ouvrables. Alors que je devrais en avoir 2 ... Alors que du 01/06/2005 au 02/06/2005 j ai bien 2 jours ouvrables.
Si qq1 a une idée et a reusi à arriver jusque (
) la je le remercie d'avance.
Je suis capable du pire comme du meilleur, mais dans le pire c'est moi le meilleur !!! 