begin process at 2012 02 15 23:48:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Général

 > 

Probleme de boucle, calcul jours ouvrés


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de boucle, calcul jours ouvrés

lundi 16 avril 2007 à 15:27:48 | Probleme de boucle, calcul jours ouvrés

Akita95

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;

?>

lundi 16 avril 2007 à 15:57:27 | Re : Probleme de boucle, calcul jours ouvrés

J_G

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++;

Qu'en penses tu?

lundi 16 avril 2007 à 19:05:36 | Re : Probleme de boucle, calcul jours ouvrés

FhX

while ($timestampStart <= $timestampEnd)

Déja, rien que l'utilisation d'un while() ici est une erreur.
C'est un for() qui aurait du être utilisé.
mardi 13 avril 2010 à 19:09:21 | Re : Probleme de boucle, calcul jours ouvrés

softghost

Bonjour,
essai ca c moin de code :

function nbjours($datedeb, $datefin) {
list ($dayF, $monthF, $yearF) = explode ('/', $datedeb);
list ($dayC, $monthC, $yearC) = explode ('/', $datefin);
if(strlen($yearF)===4){
if (false === @checkdate ($monthF, $dayF, $yearF) || false === @checkdate ($monthC, $dayC, $yearC)) {

return false;
} else {
$tFar = mktime (0,0,0,$monthF, $dayF, $yearF);
$tClose = mktime (0,0,0,$monthC, $dayC, $yearC);
$tDistance = $tFar - $tClose;
return round ($tDistance/(24*60*60));
}
}else{
return false;
}
}




apelle la function avec :
echo nbjours($au, $du);


Cette discussion est classée dans : date, jour, mois, paques, nbferie


Répondre à ce message

Sujets en rapport avec ce message

Toujours a la recherche d'aide pour les dates !!! [ par nagrom_om ] 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 p probléme calcule dimanche [ par sensoide ] Bonjour a tous,voici donc une source que j'ai pris sur phpcs, mais il y a comme qui dirait un probléme pour le calcul des dimanches et je n'arive pas traduction date [ par kenny18 ] salut,J'ai un champ type "datetime" dans une table. Je vais rechercher cette date dans mon code pour l'afficher. La date = $row[5] ci-dessous. Mon seu Calendrier / Agenda [ par kitgraphic ] Voilà j'ai un calendrier avec des évènement, tout marche bien , mais je voudrais que le jour actuel (la cellule ou il se trouve soit d'une autre coule Afficher les jours de la semaine... [ par stevethx27 ] Bonjour,je tente (en vain) d'afficher sur une ligne les jours de la semaine. J'ai utilisé un script trouvé sur le site que j'ai modifié et ça donne ma Calendrier Location [ par piep14 ] Bonjour le forum, j'aurais une question à vous soumettre car je bloque. J'ai fait un calendrier avec le code que je vous présente ci après. Le trucs, Gestion de dates [ par tryoruda ] SalutJe souhaite quelques tuyaux pour gérer les dates :- un formulaire avec choix du jour / du mois / de l'année envoie vers un seul champ Mysql date- Pb avec Date() & mktime() [ par LordDaedalus ] BonjourJe suis en train de créer un agenda en utilisant les fonctions date() et mktime().j'utilise $Jour = Date("d",mktime(Date("h")-24*10*7)Le jour e vérification d'une date [ par vir76 ] Salut tout le monde,Je dispose de la fonction suivante pour vérifier une date : Page de vérification de date en PHP<? Gestion d'erreurs [ par stailer ] Bonjour,voici ma fonction pour transformer une date MySQL en format français :function date_france($date_saisie){ list ($an , $mois , $jour) =


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,343 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales