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);
?>
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.