<?php
|
/*---------------------------------------------------------------*/
|
/*
|
Titre : Calcul le nombre de jours ouvrés entre 2 dates
|
|
URL : https://phpsources.net/code_s.php?id=666
|
Auteur : yem
|
Date édition : 04 Oct 2012
|
Date mise à jour : 29 Aout 2019
|
Rapport de la maj:
|
- fonctionnement du code vérifié
|
- amélioration du code
|
*/
|
/*---------------------------------------------------------------*/
|
|
// calcul des années bissextiles
|
function leap_year($year)
|
{
|
return date("L", mktime(0, 0, 0, 1, 1, $year));
|
}
|
|
function nb_jours( $date1, $date2 )
|
{
|
|
$timestamp1 = strtotime($date1);
|
$timestamp2 = strtotime($date2);
|
|
$tot = 0; // total de jours entre les 2 dates
|
|
// dates en jours de l'année ( depuis le 1er jan )
|
$date1 = date("z", $timestamp1) ; // date de depart
|
$date2 = date("z", $timestamp2) ; //date d'arrivée
|
|
$day_stamp = 86400 ; //(3600 * 24 ); // un journée en timestamp
|
|
// années des deux dates
|
$year1 = date("Y", $timestamp1) ;
|
$year2 = date("Y", $timestamp2) ;
|
|
$num = 0; // nombre de jours feries a compter sur la duree totale
|
$counter = 0; // la durée entre deux date par année
|
|
$year = $year1; // l'année en cours ( defaut : $year1 )
|
|
|
// on calcule le nombre de jours de différence entre les deux dates, en
|
// tenant
|
// compte des années
|
while ( $year <= $year2 )
|
{
|
$date3 = date("d-n-Y", mktime(0, 0, 0, 1, 1, $year));
|
$timestamp3 = strtotime($date3);
|
// date de référence pour l'année en cours
|
$counter = 0; // compteur de jours pour chaque année
|
|
//on récupère la date de pà¢ques
|
$easterDate = easter_date($year) ;
|
$easterDay = date('j', $easterDate) ;
|
$easterMonth = date('n', $easterDate) ;
|
$easterYear = date('Y', $easterDate) ;
|
|
|
|
// le tableau sort les jours fériés de l'année depuis le premier
|
// janvier
|
$closed = array
|
(
|
// dates fixes
|
date("z", mktime(0, 0, 0, 1, 1, $year)), // 1er janvier
|
date("z", mktime(0, 0, 0, 5, 1, $year)), // Fête du travail
|
date("z", mktime(0, 0, 0, 5, 8, $year)),
|
// Victoire des alliés
|
date("z", mktime(0, 0, 0, 7, 14, $year)), // Fête nationale
|
date("z", mktime(0, 0, 0, 8, 15, $year)), // Assomption
|
date("z", mktime(0, 0, 0, 11, 1, $year)), // Toussaint
|
date("z", mktime(0, 0, 0, 11, 11, $year)), // Armistice
|
date("z", mktime(0, 0, 0, 12, 25, $year)), // Noel
|
|
// Dates basées sur Paques
|
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 1, $easterYear)
|
|
), // Lundi de Paques
|
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 39, $easterYear
|
|
)), // Ascension
|
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 50, $easterYear
|
|
)) // Lundi de Pentecote
|
|
);
|
|
|
// si c'est la première année -> on commence par la date de depart;
|
// le compteur compte les jours jusqu'au 31dec
|
if( $year == $year1 && $year < $year2 )
|
{
|
$i = $date1;
|
$counter += (364+leap_year($year)) ;
|
}
|
|
|
// si c'est ni la première ni la dernière année -> on commence au
|
// premier
|
// janvier;
|
//le compteur compte tous les jours de l'année
|
if( $year > $year1 && $year < $year2 )
|
{
|
$i = date("z", mktime(0, 0, 0, 1, 1, $year));
|
$counter += 364+leap_year($year);
|
}
|
|
// si c'est la dernière année -> on commence au premier janvier;
|
// le compteur va jusqu'a la date d'arrivée
|
if( $year == $year2 && $year > $year1 )
|
{
|
$i = date("z", mktime(0, 0, 0, 1, 1, $year));
|
$counter += $date2 ;
|
}
|
|
// si les deux dates sont dans la même année
|
if( $year == $year1 && $year == $year2 )
|
{
|
$i = $date1;
|
$counter += $date2 ;
|
}
|
|
// on boucle les jours sur la période donnée
|
while ( $i <= $counter )
|
{
|
$tot = $tot +1; // on ajoute 1 pour chaque jour passé en revue
|
|
if( in_array($i, $closed) )
|
{
|
$num++; // on ajoute 1 pour chaque jour férié rencontré
|
}
|
|
// on compte chaque samedi et chaque dimanche
|
if(((date("w", $timestamp3 + $i * $day_stamp) == 6) or (date("w",
|
$timestamp3 + $i * $day_stamp) == 0)) and !in_array($i, $closed))
|
{
|
$num++ ;
|
}
|
$i++;
|
}
|
$year++ ; // on incremente l'année
|
}
|
$res = $tot - $num;
|
|
// nombre de jours entre les 2 dates fournies - nombre de jours non ouvrés
|
return $res;
|
}
|
?>
|
|
|
Invité
16 Juil 2015 à 18:50bravo et merci :)
Fefers
09 Mai 2015 à 17:31Merci beaucoup. c'est genial. fonctionne de tonner .. !
Fefers
09 Mai 2015 à 10:50Bonjour c'est justamen ce que j'ai besoin et je vous remercie enormement,mais je suis debutant, si vous pourriez me dire comment utilise-t-on ce code, que j'essaye y ne donne rien. mille merci
Vandouzen007
19 Nov 2013 à 06:59Bonjour, Merci beaucoup pour le code et ça marche bien! Mais comment utilise-t-on ce code avec deux input d'entrer de deux dates? Il donne le resultat automatiquement sans clicquer un bouton! Merci
Invité
23 Oct 2012 à 10:21Bonjour,
Je pense qu'il ya un petit erreur au niveau la ligne suivante:
$date3 = date("d-n-Y", mktime(0, 0, 0, 1, 1, $year));
il faut modifier la chaine "d-n-Y" par "Y-n-d".
Cordialement.