Toujours a la recherche d'aide pour les dates !!!

nagrom_om Messages postés 163 Date d'inscription lundi 20 décembre 2004 Statut Membre Dernière intervention 1 novembre 2006 - 1 juil. 2005 à 11:07
mageonyme Messages postés 121 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 1 décembre 2009 - 1 juil. 2005 à 12:10
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. /auteurdetail.aspx?ID=406785 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 !!!

1 réponse

mageonyme Messages postés 121 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 1 décembre 2009
1 juil. 2005 à 12:10
désolé mais pourquoi tu n'utilise pas plutot la fonction time(); qui donne le nombre de seconde (depuis une date dans les années 70) et qui permet donc de franchir toutes les barrières concernant les années bisextiles et tout le reste

exemple :

$date=time(); ça donne par exemple 1120160918 (en sec)

puis tu utilise pr l'écart une fonction

je sais il faut tout refaire, mais c'est moins prise de tete après avec ce type de date...
0
Rejoignez-nous