Calcul nombre jour ouvrable (jour ferier) entre 2 dates

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 579 fois - Téléchargée 14 fois

Contenu du snippet

Cette fonction permet de donner un nombre de jour ouvrable entre deux dates.
-Les filtres sont:

-Le samedi et dimanche

-Les jours fériés:
>Jour de l'an {1 Janvier}
>Fête du Travail {1 Mai}
>8 Mai 1945
>Fête Nationale {14 Juillet}
>Assomption {15 Aout}
>La Toussaint {1 Novembre}
>Armistice {11 Novembre}
>Noël {25 Décembre}

-Les jours spéciaux:
>Lundi de pâques
>Ascension
>Lundi de Pentecôte

Bonne journée

Source / Exemple :


<?php

//Algorithme de Oudin, calcul du dimanche de Pâque postérieure à 1583 (+1 dans le return pour avoir le lundi)
function LundiPaques($annee=NULL)
{
	$annee=($annee==NULL) ? date("Y") : $annee;
	
	$G = $annee%19;
	$C = floor($annee/100);
	$C_4 = floor($C/4);
	$E = floor((8*$C + 13)/25);
	$H = (19*$G + $C - $C_4 - $E + 15)%30;

	if($H==29){
        $H=28;
	}elseif($H==28 && $G>10){
        $H=27;
	}
	
    $K = floor($H/28);
	$P = floor(29/($H+1));
	$Q = floor((21-$G)/11);
	$I = ($K*$P*$Q - 1)*$K + $H;
	$B = floor($annee/4) + $annee;
	$J1 = $B + $I + 2 + $C_4 - $C;
	$J2 = $J1%7;
	$R = 28 + $I - $J2; 
	$mois = $R>30 ? 4 : 3;
	$Jour = $mois==3 ? $R : $R-31;

	return mktime(0,0,0,$mois,$Jour+1,$annee);
}

//Ascension est 38 jours après paques. 3283200 secondes = 38 jours;
function Ascension($LundiPaques)
{
	return $LundiPaques + 3283200;
}

//Lundi de Pentecôte 	20 Mai 	9 Juin 	25 Mai
//Pentecôte est 11 jours après Ascension. 950400 secondes = 11 jours;
function LundiPentecote($Ascension)
{
	return $Ascension + 950400;
}

// mettre les variables en mktime(0, 0, 0, Mois, Jour, Année)
function nbJourOuvrable($dateStart,$dateStop)
{
	$opendays = 0;
	$interval = 86400; // 1 Jour en Seconde
	
	$dateFerie = array();
	
	$Y = date("Y",$dateStart);
	$LundiPaques = LundiPaques($Y);
	$Ascension = Ascension($LundiPaques);
	$LundiPentecote = LundiPentecote($Ascension);
	
	$dateFerie[0] = mktime(0, 0, 0, 1, 1, $Y); //Jour de l'an {1 Janvier}
	$dateFerie[1] = mktime(0, 0, 0, 5, 1, $Y); //Fête du Travail {1 Mai}
	$dateFerie[2] = mktime(0, 0, 0, 5, 8, $Y); // 8 Mai 1945 
	$dateFerie[3] = mktime(0, 0, 0, 7, 14, $Y); // Fête Nationale {14 Juillet}
	$dateFerie[4] = mktime(0, 0, 0, 8, 15, $Y); // Assomption {15 Aout}
	$dateFerie[5] = mktime(0, 0, 0, 11, 1, $Y); // La Toussaint {1 Novembre}
	$dateFerie[6] = mktime(0, 0, 0, 11, 11, $Y); // Armistice {11 Novembre}
	$dateFerie[7] = mktime(0, 0, 0, 12, 25, $Y); // Noël {25 Décembre}
	
	$mSimple = false;
	// *  Si $dateStart,$dateStop faut partie de la même année alors les dates spéciales seront de la même année
	// ** Sinon, Il faut calculer chaque date en function de son année (Si elle change)
	if(date("Y",$dateStart) == date("Y",$dateStop)){
		$mSimple = true;
	}
	
	//$LundiPaques = LundiPaques($Y)
	for ($i=$dateStart; $i <= $dateStop; $i=$i+$interval) {
		
		if(date("N",$i) > 5){continue;}; //Supprime le 6=Samedi et 7=Dimanche
		
		if($mSimple){
			// *
			if($i == $LundiPaques){continue;}
			if($i == $Ascension){continue;}
			if($i == $LundiPentecote){continue;}
			
		}else{
			// **
			$Yi = date("Y",$i);
			
			if($Yi != $Y){
				
				$Y = $Yi;
				$LundiPaques = LundiPaques($Y);
				$Ascension = Ascension($LundiPaques);
		 		$LundiPentecote = LundiPentecote($Ascension);
				
				$dateFerie[0] = mktime(0, 0, 0, 1, 1, $Y); //Jour de l'an {1 Janvier}
				$dateFerie[1] = mktime(0, 0, 0, 5, 1, $Y); //Fête du Travail {1 Mai}
				$dateFerie[2] = mktime(0, 0, 0, 5, 8, $Y); // 8 Mai 1945 
				$dateFerie[3] = mktime(0, 0, 0, 7, 14, $Y); // Fête Nationale {14 Juillet}
				$dateFerie[4] = mktime(0, 0, 0, 8, 15, $Y); // Assomption {15 Aout}
				$dateFerie[5] = mktime(0, 0, 0, 11, 1, $Y); // La Toussaint {1 Novembre}
				$dateFerie[6] = mktime(0, 0, 0, 11, 11, $Y); // Armistice {11 Novembre}
				$dateFerie[7] = mktime(0, 0, 0, 12, 25, $Y); // Noël {25 Décembre}
				
			}
			
			if($i == $LundiPaques){continue;}
			if($i == $Ascension){continue;}
			if($i == $LundiPentecote){continue;}
				
		}
		
		//Jours feriés
		if($i == $dateFerie[0]){continue;}
		if($i == $dateFerie[1]){continue;}
		if($i == $dateFerie[2]){continue;}
		if($i == $dateFerie[3]){continue;}
		if($i == $dateFerie[4]){continue;}
		if($i == $dateFerie[5]){continue;}
		if($i == $dateFerie[6]){continue;}
		if($i == $dateFerie[7]){continue;}
		
		//Si, On est passé à travers les filtres, c'est un jour ouvrable !
		//echo "<br>";
		//echo $i  .date(" {N} D, d-m-y",$i);
		
		$opendays++;
	}
	return $opendays;
}
?>

Conclusion :


<?php

//mktime(0, 0, 0, MOIS, JOUR, ANNEE)

$d1 = mktime(0, 0, 0, 12, 24, 2012);
$d2 = mktime(0, 0, 0, 1, 7, 2013);

echo nbJourOuvrable($d1,$d2);

?>

A voir également

Ajouter un commentaire

Commentaire

Merci pour ce code, très efficace !

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.