Voici une fonction qui permet d'ajouter des jours ouvrables à une date.
function add_business_days($startdate,$buisnessdays,$holidays,$dateformat){
$i=1;
$dayx = strtotime($startdate);
while($i < $buisnessdays){
$day = date('N',$dayx);
$date = date('Y-m-d',$dayx);
if($day < 6 && !in_array($date,$holidays))$i++;
$dayx = strtotime($date.' +1 day');
}
return date($dateformat,$dayx);
}
//Example
date_default_timezone_set('Europe\London');
$startdate = '2012-01-08';
$holidays=array("2012-01-10");
echo '<p>Start date: '.date('r',strtotime( $startdate));
echo '<p>'.add_business_days($startdate,7,$holidays,'r');
Un autre article mentionne getWorkingDays (tiré des commentaires de php.net et inclus ici) mais je pense que cela ne fonctionne pas si vous commencez un dimanche et terminez un jour ouvrable.
En utilisant ce qui suit (vous devrez inclure la fonction getWorkingDays du post précédent)
date_default_timezone_set('Europe\London');
//Example:
$holidays = array('2012-01-10');
$startDate = '2012-01-08';
$endDate = '2012-01-13';
echo getWorkingDays( $startDate,$endDate,$holidays);
Donne le résultat 5 et non 4
Sun, 08 Jan 2012 00:00:00 +0000 weekend
Mon, 09 Jan 2012 00:00:00 +0000
Tue, 10 Jan 2012 00:00:00 +0000 holiday
Wed, 11 Jan 2012 00:00:00 +0000
Thu, 12 Jan 2012 00:00:00 +0000
Fri, 13 Jan 2012 00:00:00 +0000
La fonction suivante a été utilisée pour générer les données ci-dessus.
function get_working_days($startDate,$endDate,$holidays){
$debug = true;
$work = 0;
$nowork = 0;
$dayx = strtotime($startDate);
$endx = strtotime($endDate);
if($debug){
echo '<h1>get_working_days</h1>';
echo 'startDate: '.date('r',strtotime( $startDate)).'<br>';
echo 'endDate: '.date('r',strtotime( $endDate)).'<br>';
var_dump($holidays);
echo '<p>Go to work...';
}
while($dayx <= $endx){
$day = date('N',$dayx);
$date = date('Y-m-d',$dayx);
if($debug)echo '<br />'.date('r',$dayx).' ';
if($day > 5 || in_array($date,$holidays)){
$nowork++;
if($debug){
if($day > 5)echo 'weekend';
else echo 'holiday';
}
} else $work++;
$dayx = strtotime($date.' +1 day');
}
if($debug){
echo '<p>No work: '.$nowork.'<br>';
echo 'Work: '.$work.'<br>';
echo 'Work + no work: '.($nowork+$work).'<br>';
echo 'All seconds / seconds in a day: '.floatval(strtotime($endDate)-strtotime($startDate))/floatval(24*60*60);
}
return $work;
}
date_default_timezone_set('Europe\London');
//Example:
$holidays=array("2012-01-10");
$startDate = '2012-01-08';
$endDate = '2012-01-13';
//broken
echo getWorkingDays( $startDate,$endDate,$holidays);
//works
echo get_working_days( $startDate,$endDate,$holidays);
Apportez les vacances...
0 votes
J'ai créé une bibliothèque décente pour cela. github.com/andrejsstepanovs/business-days-calculator Il est stable et prêt à entrer en production.
6 votes
Oh, je pense que nous devrions mentionner que, de nos jours, nous pouvons utiliser la fonction DateTime::modify pour ajouter directement les jours de la semaine : $my_date = new \DateTime () ; $my_date->modify("+ 7 weekday") ; s'exécutera simplement sans problème.
0 votes
Un blog de détail : goo.gl/YOsfPX
0 votes
Une réponse plus simple et plus propre : stackoverflow.com/questions/5532002/