CALCULE DES JOURS OUVRÉS + JOURS FERIÉS

sensoide Messages postés 102 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 1 août 2007 - 21 juil. 2006 à 17:23
psykoose Messages postés 2 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 14 mai 2012 - 14 mai 2012 à 16:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38707-calcule-des-jours-ouvres-jours-feries

psykoose Messages postés 2 Date d'inscription samedi 20 mars 2010 Statut Membre Dernière intervention 14 mai 2012
14 mai 2012 à 16:22
je ne sait pas pourquoi mais le code proposé par JackSample est pas mauvais, mais a un problème lorsque le jours ferié est le 08 du mois, idem avec le 09 du mois.
étrange.
JackSample Messages postés 1 Date d'inscription dimanche 31 décembre 2006 Statut Membre Dernière intervention 31 décembre 2006
31 déc. 2006 à 21:25
Voir les adaptations que j'ai faites sur ce code pour qu'il fonctionne, j'espère correctement :

// ---> added by mir : 2006.12.31

//ECRIT PAR NANOGROM_OM
//MODIFIE PAR AYTAC GUNTAC
//LE 21/07/2006

function mir__elapsed_days($date_debutCP, $date_finCP)
{
$tDeb = explode("/", $date_debutCP);
$tFin = explode("/", $date_finCP);

$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);

}

// 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 mir__holidays($date_debutCP, $date_finCP,$valeur_retour)
{
$tDeb = explode("/", $date_debutCP);
$tFin = explode("/", $date_finCP);

$timestampStart = mktime(0, 0, 0, $tDeb[1], $tDeb[0], $tDeb[2]);
$timestampEnd = mktime(0, 0, 0, $tFin[1], $tFin[0], $tFin[2]);

// Initialisation de la date de début
$nbFerie = 0;
$nbFerie2 = 0;
while ($timestampStart <= $timestampEnd)
{
// 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)
}
else
{
$jour = date("d", $timestampStart);
$mois = date("m", $timestampStart);
$annee = date("Y", $timestampStart);

// Définition des dates fériées fixes
if($jour 01 && $mois 01) $nbFerie2++; // 1er janvier
if($jour 01 && $mois 05) $nbFerie2++; // 1er mai
if($jour 08 && $mois 05) $nbFerie2++; // 5 mai
if($jour 21 && $mois 07) $nbFerie2++; // 21 juillet
if($jour 15 && $mois 08) $nbFerie2++; // 15 aout
if($jour 01 && $mois 11) $nbFerie2++; // 1 novembre
if($jour 11 && $mois 11) $nbFerie2++; // 11 novembre
if($jour 25 && $mois 12) $nbFerie2++; // 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) $nbFerie2++;
// Pâques

// Calcul du Lundi de Pâques (1er jour après Pâques)
$date_paques = $date_paques + 86400;
$jour_paques = date("d", $date_paques);
$mois_paques = date("m", $date_paques);
if($jour_paques $jour && $mois_paques $mois) $nbFerie2++;
// Pâques

// Calcul du jour de l'Ascension (39ème jour après Pâques)
$date_ascension = $date_paques + (39 * 86400);
$jour_ascension = date("d", $date_ascension);
$mois_ascension = date("m", $date_ascension);
if($jour_ascension $jour && $mois_ascension $mois) $nbFerie2++;
// Ascension

// Calcul du jour de la Pentecôte (49ème jour après Pâques)
$date_pentecote = $date_paques + (49 * 86400);
$jour_pentecote = date("d", $date_pentecote);
$mois_pentecote = date("m", $date_pentecote);
if($jour_pentecote $jour && $mois_pentecote $mois) $nbFerie2++;
// Pentecote

// Calcul du Lundi de la Pentecôte (1er jour après Pentecôte)
$date_pentecote = $date_pentecote + (86400);
$jour_pentecote = date("d", $date_pentecote);
$mois_pentecote = date("m", $date_pentecote);
if($jour_pentecote $jour && $mois_pentecote $mois) $nbFerie2++;
// Lundi de la Pentecôte

}

$timestampStart=$timestampStart+86400;
}
switch ($valeur_retour)
{
case '1':
{
return $nbFerie;
break;
}
case '2':
{
return $nbFerie2;
break;
}
default:
{
return $nbFerie+$nbFerie2;
break;
}
}
}//Fin de la fonction
griese Messages postés 139 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 27 février 2008
27 juil. 2006 à 15:19
Merci pour cette fonction qui m'est du grand secours. J'ai une petite remarque concernant le jour de paques. En fait, la fonction calcule bien le jour de paques. Mais le jour de paques donc toujours un dimanche. Donc il est automatiquement férié. Par contre, le lundi de paques est férié. Donc il faut rajouter +1 à la ligne 67 ce qui donne :
$jour_paques = date("d", $date_paques)+1;
Voila sinon j'ai un souci avec, c'est que pour le mois d'aout 2006, il me retourne 23 jours ouvrés alors qu'il devrait y avoir 22. Bizarre...
kiki2sirom Messages postés 153 Date d'inscription mardi 17 août 2004 Statut Membre Dernière intervention 23 décembre 2010
25 juil. 2006 à 11:58
avec :

$date_debutCP = '30/01/2006' ;
$date_finCP = '08/10/2006' ;

problème avec NBjour; le rajout d'un petit round dans le return de la fonction n'arrangerait pas la chose ?

Ouvert : 180
NBjour : 251.95833333333
NBferié : 72

* déjà on ne dit pas 'ouvert', mais 'ouvré'
* c'aurait été mieux de séparer les jours fériés, et les samedis et dimanches, non ?

voilà pour les qq petites remarques (constructives ? je ne sais pas)

cdt

kiki
cs_trashouille Messages postés 1 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 25 juillet 2006
25 juil. 2006 à 10:52
pas mal, cependant le + 11 pour la pentecote me choque un peu. si paques tombes un 30, la pentecôte tomberait un 41 ?? Idem pour l'ascension 38 jours apres paques.
je te conseille un truc du genre
$jourAscension=date("d",$date_ascension);
$datePaques=explode("-",date("n-d", mktime(0, 0, 0, $moisAscension, $jourAscension+11, date("Y"))));
jour=" . $datePaques[1]

je dis ca mais je n'ai pas testé ton code mais je suppose que si tu l'as mis en ligne, c'est que ça doit marcher.
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
22 juil. 2006 à 11:34
Pour le 1 de mes remarques j'ai oublié: un tableau permettrait en plus de gérer les jours fériés de plusieurs pays (car les jours fériés français ne sont ceux fériés en allemagne, US ou autres)
guill76 Messages postés 193 Date d'inscription mercredi 24 août 2005 Statut Membre Dernière intervention 3 juin 2016
22 juil. 2006 à 11:28
Plusieurs choses :
1 - Pourquoi ne stocke tu pas dans un tableau paramétrable tes jours fériés:
Imagine que le gouvernement décide de supprimer un jour ferié (déjà vu)ou d'octroyer(très peu probable) un jour férié supplémenentaire, il te faudra alors modifier ton script(peu souple).
2 - La ligne suivante me derange:
if($jour_semaine 1||$jour_semaine 2||$jour_semaine == 3||$jour_semaine == 4||$jour_semaine == 5) (c'est strictement la condition complémentaire à ta première donc un else suffit et évite toute depense inutile de ton proc serveur).
3 - Initié? bof tu serais pas un peu prétentieux par hasard?
sensoide Messages postés 102 Date d'inscription mardi 17 janvier 2006 Statut Membre Dernière intervention 1 août 2007
21 juil. 2006 à 17:23
Juste un oublie de ma part mais je pense que vous l'auriez corrigez par vous méme.
$date_finCP = '31/09/2006' ;
a remplacez par
$date_finCP = '30/09/2006' ;
et oui il n'y a que 30 jours en septembre :-)
Rejoignez-nous