Calcule des jours ouvrés + jours feriés

Soyez le premier à donner votre avis sur cette source.

Snippet vu 43 770 fois - Téléchargée 24 fois

Contenu du snippet

Ce code vous permet de calculer le nombre de samedi et de dimanche entre deux dates.
Mais il y ajoute aussi les jours fériés, pour obtenir au final le nombre de jours ouvrés.
C'est un code éxistant que j'ai modifié par ce qu'il manquait de precision.
Par ce que si un jour férié tombait un dimanche il était comptabiliser deux fois.
Alors que la il ne le serat plus qu'une fois.
Dite mois ce que vous pensez de ce source, c'est le premier que je publie.
Merci.

Source / Exemple :


<?php
//ECRIT PAR NANOGROM_OM
//MODIFIE PAR AYTAC GUNTAC
//LE 21/07/2006

$date_debutCP = '01/09/2006' ;
$date_finCP = '31/09/2006' ;

function NbJours($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);

}

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

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

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

				/*CECI A ETE RAJOUTE PAR MES SOINS*/

			if($jour_semaine == 1||$jour_semaine == 2||$jour_semaine == 3||$jour_semaine == 4||$jour_semaine == 5)
			{
         // 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 == 14 && $mois == 07) $nbFerie2++; // 14 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 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) $nbFerie2++;
         //Ascension

         // Calcul de Pentecôte (11 jours après Paques)
        $date_pentecote = mktime(date("H", $date_ascension),
         date("i", $date_ascension),
         date("s", $date_ascension),
         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) $nbFerie2++;
         //Pentecote
			}

			$jour++;
			$timestampStart=mktime(0,0,0,$mois,$jour,$annee);
			$nbJour = ($timestampEnd - $timestampStart / (60*60*24));
         // Incrémentation du nombre de jour ( on avance dans la boucle)
    }
     return $nbFerie+$nbFerie2;
}//Fin de la fonction

$a=NbJours($date_debutCP, $date_finCP);
$b=jour_ferie($timestampStart, $timestampEnd);
$testcp = round( $a - $b , 0);

echo 'Ouvert : '.$testcp.'</br> NBjour : '.$a.'</br> NBferié : '.$b;
?>

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
samedi 20 mars 2010
Statut
Membre
Dernière intervention
14 mai 2012

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.
Messages postés
1
Date d'inscription
dimanche 31 décembre 2006
Statut
Membre
Dernière intervention
31 décembre 2006

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
Messages postés
139
Date d'inscription
dimanche 9 mai 2004
Statut
Membre
Dernière intervention
27 février 2008

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...
Messages postés
153
Date d'inscription
mardi 17 août 2004
Statut
Membre
Dernière intervention
23 décembre 2010

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
Messages postés
1
Date d'inscription
samedi 1 février 2003
Statut
Membre
Dernière intervention
25 juillet 2006

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.
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.