Calcul simple du nombre de jours ouvrés entre deux dates (jours fériés intégrés)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 44 317 fois - Téléchargée 18 fois

Contenu du snippet

Cette fonction permet de calculer le nombre de jours ouvrés entre deux dates, week-end et jours fériés compris.
Il existe des tas de fonctions le permettant, mais pour créer celle-ci, je me suis en grande partie basé sur une source de malalam (http://www.phpcs.com/codes/JOURS-OUVRES_38705.aspx) qui permet de récupérer une date d'arrivée en une utilisant une date de départ et un nombre delta de jours.

Je l'ai donc dérivée pour faire la différence entre deux dates. J'ai également intégrer la possibilité d'avoir une année de départ différente de l'année d'arrivée (et donc certains jours fériés dont la date change).

J'ai hésité avant de la poster car je n'étais pas totalement sûr de son utilité par rapport à celles existantes. Cependant, elle est plus courte que la plupart des fonctions que j'ai pu voir et intègre le changement d'année.

Amusez-vous bien.
(Et si y a des bugs je suis tout ouïe)

PS : Si vous vous foutez du changement d'année, virez le for, et histoire de gagner en performances, virez tout ce qui se rapporte à l'année.

Source / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

-
Super et facilement améliorable via un formulaire et utiliser de variables !
vandouzen007
Messages postés
48
Date d'inscription
lundi 21 octobre 2013
Statut
Membre
Dernière intervention
29 mars 2014
1 -
Bonjour!
Merci pour le code et ça marche bien! mais j'aimerai faire que les dates(date début et date fin) sont entrées dans un input type="text"!
Quelqu'un pourra m'aider?
C'est urgent
lara31
Messages postés
2
Date d'inscription
mardi 12 mai 2009
Statut
Membre
Dernière intervention
13 février 2013
-
merci, je recherchais une source comme celle-là...
cs_virgin12
Messages postés
1
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 décembre 2011
-
Très bon code.. Merci encore
david13f
Messages postés
1
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
22 septembre 2011
-
Excellent code, et très bien commenté, ce qui ne gâche rien: BRAVO et MERCI!

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.