Akita95
Messages postés23Date d'inscriptiondimanche 13 mars 2005StatutMembreDernière intervention30 juillet 2007
-
16 avril 2007 à 15:27
softghost
Messages postés61Date d'inscriptionvendredi 11 mars 2005StatutMembreDernière intervention13 avril 2010
-
13 avril 2010 à 19:09
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);
// 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."
";
$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
J_G
Messages postés1406Date d'inscriptionmercredi 17 août 2005StatutMembreDernière intervention28 août 200710 16 avril 2007 à 15:57
Salut...
Je n'ai pas trouvé le pb, mais même sans ce pb je trouve que la méthode est mauvaise....
Tu te payes chaque jour entre tes deux dates. Pour chaque jour, tu te (re)payes le calcule des jours fériés. Bref, c'est pas beau !
Plusieurs idées a te soumettre :
1. Sachant que les jours fériés ne se répète qu'une fois pas an, tu pourrais ne boucler que sur les années !
De toute façon, il y a X jours fériés par années (sauf nouvelle loi saugrenue)...
Donc, pour Y années complète, X*Y jours fériés...
2. ta date 15/08/2007 deviens le nombre $deb=20070815 et 27/08/2007 le nombre $fin=20070827
On est dans l'année 2007... Tu calcules les jours férié de cette années (une fois!)
genre le 1 janvier sera 01/01/2007, soit le nombre $sylvestre=20070101.
Puis d'un simple coup d'oeil : ( $sylvestre >= $deb and $sylvestre <= $fin ) est faux...
on ne fetera donc pas la saint sylvestre en Aout!
3. En gros :
=> une fonction joursFeriers( $annee ); qui retourne un tableau contenant tous les jours feriers de l'année (format nombre)
> une boucle foreach ( joursFeriers( 2007 ) as $j ) if ( $deb<$j and $fin=> ) $mes_jours_libre++;