<?php
// Fonction permettant de compter le nombre de jours ouvrés entre deux dates
function get_nb_open_days($date_start, $date_stop) {	
	$arr_bank_holidays = array(); // Tableau des jours feriés	
	
	// On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée
	$diff_year = date('Y', $date_stop) - date('Y', $date_start);
	for ($i = 0; $i <= $diff_year; $i++) {			
		$year = (int)date('Y', $date_start) + $i;
		// Liste des jours feriés
		$arr_bank_holidays[] = '1_1_'.$year; // Jour de l'an
		$arr_bank_holidays[] = '1_5_'.$year; // Fete du travail
		$arr_bank_holidays[] = '8_5_'.$year; // Victoire 1945
		$arr_bank_holidays[] = '14_7_'.$year; // Fete nationale
		$arr_bank_holidays[] = '15_8_'.$year; // Assomption
		$arr_bank_holidays[] = '1_11_'.$year; // Toussaint
		$arr_bank_holidays[] = '11_11_'.$year; // Armistice 1918
		$arr_bank_holidays[] = '25_12_'.$year; // Noel
				
		// Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote	
		$easter = easter_date($year);
		$arr_bank_holidays[] = date('j_n_'.$year, $easter + 86400); // Paques
		$arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*39)); // Ascension
		$arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*50)); // Pentecote	
	}
	//print_r($arr_bank_holidays);
	$nb_days_open = 0;
	// Mettre <= si on souhaite prendre en compte le dernier jour dans le décompte	
	while ($date_start < $date_stop) {
		// Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on incrémente les jours ouvrés	
		if (!in_array(date('w', $date_start), array(0, 6)) 
		&& !in_array(date('j_n_'.date('Y', $date_start), $date_start), $arr_bank_holidays)) {
			$nb_days_open++;		
		}
		$date_start = mktime(date('H', $date_start), date('i', $date_start), date('s', $date_start), date('m', $date_start), date('d', $date_start) + 1, date('Y', $date_start));			
	}		
	return $nb_days_open;
}

// Exemple : Du 11 au 15 juillet il n'y a qu'un jour ouvré (week-end + 1 jours férié)
$date_depart = strtotime('2008-07-11');
$date_fin = strtotime('2008-07-15');
$nb_jours_ouvres = get_nb_open_days($date_depart, $date_fin);
echo 'Il y a '.$nb_jours_ouvres.' jours ouvrés entre le '.date('d/m/Y', $date_depart).' et le '.date('d/m/Y', $date_fin);
?>





//calcul des années bissextiles
function leap_year($year) {
return date("L", mktime(0, 0, 0, 0, 0, $year));
}

//calcul des jours non-ouvrés
function sort_closed_days( $timestamp1, $timestamp2 ) {
//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
$jour_fin = 0; // dernier jours a checker
$tab_jours = array(); //liste des jours concernés
$year = $year1; // l'année en cours ( defaut : $year1 )

//on calcule le nombre de jours de difference entre les deux dates, en tenant
// compte des années
while ( $year <= $year2 ) { //on liste les jours fériés de l'année en cours     $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)) => 'Noël',

// Dates basées sur Paques
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 2, $easterYear)) => 'Lundi de Paques',
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 40, $easterYear)) => 'Ascension',
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 50, $easterYear)) => 'Dimanche de Pentecôte',
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 51, $easterYear)) => 'Lundi de Pentecôte'
);

//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 ) { $jour_deb = $date1; $jour_fin = 365+leap_year($year); } // si c'est ni la première ni la derniere année -> on commence au premier
// janvier; le compteur compte tous les jours de l'année
if( $year > $year1 && $year < $year2 ) { $jour_deb = date("z", mktime(0, 0, 0, 1, 1, $year)); $jour_fin = 365+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 ) {
$jour_deb = date("z", mktime(0, 0, 0, 1, 1, $year));
$jour_fin = $date2;
}

// si les deux dates sont dans la même année
if( $year == $year1 && $year == $year2 ) {
$t = 'meme année';
$jour_deb = $date1;
$jour_fin = $date2;
}

//on boucle les jours sur la période donnée pour cette année
while ( $jour_deb <= $jour_fin ) { $thisday = strtotime("+".($jour_deb)." day", mktime(12, 0, 0, 01, 01, $year)); //on compte chaque jour férié if( array_key_exists($jour_deb, $closed) ) { $tab_jours[] = $closed[$jour_deb]; $num++; } //on compte chaque samedi if( date("w", $thisday) == 6  && !array_key_exists($jour_deb, $closed) ) { $tab_jours[] = 'Samedi '.date('d/m/Y', $thisday); $num++ ; } //et chaque dimanche if( date("w", $thisday) == 0 && !array_key_exists($jour_deb, $closed) ) { $tab_jours[] = 'Dimanche '.date('d/m/Y', $thisday); $num++ ; } $jour_deb++; } $year++ ; // on incremente l'année } return $tab_jours; }


