<?php
|
/*---------------------------------------------------------------*/
|
/*
|
Titre : Calcul le nombre de jours non-ouvrés entre 2 dates
|
|
URL : https://phpsources.net/code_s.php?id=644
|
Auteur : seanron
|
Website auteur : http://seanron.free.fr
|
Date édition : 12 Mai 2011
|
Date mise à jour : 13 Aout 2019
|
Rapport de la maj:
|
- fonctionnement du code vérifié
|
*/
|
/*---------------------------------------------------------------*/
|
|
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
|
$counter = 0;
|
// la durée entre les deux date, sur l'année en cours ou sur plusieurs
|
// années
|
|
$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))+1, // 1er janvier
|
date("z", mktime(0, 0, 0, 5, 1, $year))+1,
|
// Fête du travail
|
date("z", mktime(0, 0, 0, 5, 8, $year))+1,
|
// Victoire des alliés
|
date("z", mktime(0, 0, 0, 7, 14, $year))+1,
|
// Fête nationale
|
date("z", mktime(0, 0, 0, 8, 15, $year))+1, // Assomption
|
date("z", mktime(0, 0, 0, 11, 1, $year))+1, // Toussaint
|
date("z", mktime(0, 0, 0, 11, 11, $year))+1, // Armistice
|
date("z", mktime(0, 0, 0, 12, 25, $year))+1, // Noel
|
|
// Dates basées sur Paques
|
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 2,
|
$easterYear))+1, // lundi de Paques
|
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 40,
|
$easterYear))+1, // Ascension
|
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 50,
|
$easterYear))+1, // Dimanche Pentecote
|
date("z", mktime(0, 0, 0, $easterMonth, $easterDay + 51,
|
$easterYear))+1 // 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 += (
|
365+leap_year($year) ) - $date1 ; } ;
|
|
|
// 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 ){ $i = date("z", mktime(0, 0,
|
0, 1, 1, $year)); $counter += 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 ){ $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 pour cette année
|
while ( $i < $counter )
|
{
|
//on compte chaque jour férié
|
if( in_array($i, $closed) ) $num++;
|
|
//on compte chaque samedi
|
if( date("w", $timestamp1 + $i * $day_stamp) == 5 && !in_array(
|
$i, $closed) ) $num++ ;
|
|
//et chaque dimanche
|
if( date("w", $timestamp1 + $i * $day_stamp) == 6 && !in_array(
|
$i, $closed) ) $num++ ;
|
|
$i++;
|
}
|
|
$year++ ; // on incremente l'année
|
}
|
|
return $num;
|
}
|
?>
|
|
|
Invité
04 Oct 2012 à 16:21bonjour, Merci pour ce code, je m'en suis servie pour calculer le nombre de jours ouvrés entre 2 dates. Cependant j'ai du faire beaucoup de modifications pour que celà fonctionne parfaitement chez moi. Mais ça m'a au moins servi de base car je ne connaissais pas les formules pour trouver les jours fériés par exemple. De plus je voulais signaler que la fonction
n'est pas correcte. J'ai l'impression que ça prend l'année précédente car cette fonction renvoie 0 pour 2012 et 1 pour 2013, en fait il faut faire :
Et aussi, même si ça a déjà été dit : la fonction date() avec "w" comme paramètre de format renvoie le jour au format numérique de 0 (pour dimanche) à 6 (pour samedi).
Bref y'a pas mal de modifs a faire dans ce code mais grand Merci quand même.
Invité
10 Juil 2012 à 11:27ce qui m'embête un peu dans ce code, c'est l'initialisation du tableau dans la boucle while.... J'ai repris ce programme pour afficher tous les dimanches et jours fériés entre deux dates, et j'ai initialisé le tableau $closed à l'extérieur de la boucle. Ca marche parfaitement. Merci !!
Invité
10 Mai 2012 à 09:49La fonction ne marche pas du tout, entre le 05/01/2012 et le 10/01/2012, pour elle il n'y a aucun samedi ni dimanche
Invité
12 Oct 2011 à 14:55Bonjour,
Il y a une petite erreur dans ce script. Au lieu de comptabiliser les samedis et les dimanches, le script comptabilise les vendredis et les samedis. En effet la fonction date() avec "w" comme paramètre de format renvoie le jour au format numérique de 0 (pour dimanche) à 6 (pour samedi).
Cordialment.
Seanron
13 Mai 2011 à 10:48petite correction concernant deux dates de la même année. code mis a jour.