
AdamTheHutt
Ich brauche eine Methode zum Hinzufügen von “Werktagen” in PHP. Beispiel: Freitag, 5.12. + 3 Werktage = Mittwoch, 10.12.
Zumindest brauche ich den Code, um Wochenenden zu verstehen, aber idealerweise sollte er auch US-Bundesfeiertage berücksichtigen. Ich bin mir sicher, dass ich bei Bedarf eine Lösung mit roher Gewalt finden könnte, aber ich hoffe, dass es da draußen einen eleganteren Ansatz gibt. Jeder?
Danke.
Holen Sie sich die Nummer von Arbeitstage ohne Feiertage zwischen zwei Terminen:
Anwendungsbeispiel:
echo number_of_working_days('2013-12-23', '2013-12-29');
Ausgabe:
3
Funktion:
function number_of_working_days($from, $to) {
$workingDays = [1, 2, 3, 4, 5]; # date format = N (1 = Monday, ...)
$holidayDays = ['*-12-25', '*-01-01', '2013-12-23']; # variable and fixed holidays
$from = new DateTime($from);
$to = new DateTime($to);
$to->modify('+1 day');
$interval = new DateInterval('P1D');
$periods = new DatePeriod($from, $interval, $to);
$days = 0;
foreach ($periods as $period) {
if (!in_array($period->format('N'), $workingDays)) continue;
if (in_array($period->format('Y-m-d'), $holidayDays)) continue;
if (in_array($period->format('*-m-d'), $holidayDays)) continue;
$days++;
}
return $days;
}

Jakob Nudeln
Die Urlaubsberechnung ist in jedem Staat nicht standardisiert. Ich schreibe eine Bankanwendung, für die ich einige harte Geschäftsregeln benötige, kann aber immer noch nur einen groben Standard bekommen.
/**
* National American Holidays
* @param string $year
* @return array
*/
public static function getNationalAmericanHolidays($year) {
// January 1 - New Year’s Day (Observed)
// Calc Last Monday in May - Memorial Day strtotime("last Monday of May 2011");
// July 4 Independence Day
// First monday in september - Labor Day strtotime("first Monday of September 2011")
// November 11 - Veterans’ Day (Observed)
// Fourth Thursday in November Thanksgiving strtotime("fourth Thursday of November 2011");
// December 25 - Christmas Day
$bankHolidays = array(
$year . "-01-01" // New Years
, "". date("Y-m-d",strtotime("last Monday of May " . $year) ) // Memorial Day
, $year . "-07-04" // Independence Day (corrected)
, "". date("Y-m-d",strtotime("first Monday of September " . $year) ) // Labor Day
, $year . "-11-11" // Veterans Day
, "". date("Y-m-d",strtotime("fourth Thursday of November " . $year) ) // Thanksgiving
, $year . "-12-25" // XMAS
);
return $bankHolidays;
}

Suresh Kamrushi
$startDate = new DateTime( '2013-04-01' ); //intialize start date
$endDate = new DateTime( '2013-04-30' ); //initialize end date
$holiday = array('2013-04-11','2013-04-25'); //this is assumed list of holiday
$interval = new DateInterval('P1D'); // set the interval as 1 day
$daterange = new DatePeriod($startDate, $interval ,$endDate);
foreach($daterange as $date){
if($date->format("N") <6 AND !in_array($date->format("Y-m-d"),$holiday))
$result[] = $date->format("Y-m-d");
}
echo "<pre>";print_r($result);
Hier ist eine Funktion zum Hinzufügen von Geschäftstagen zu einem Datum
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');
Ein anderer Beitrag erwähnt getWorkingDays (aus php.net-Kommentaren und hier enthalten), aber ich denke, es bricht zusammen, wenn Sie an einem Sonntag beginnen und an einem Arbeitstag enden.
Verwenden Sie Folgendes (Sie müssen die getWorkingDays-Funktion aus dem vorherigen Beitrag einfügen)
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);
Gibt das Ergebnis als 5 und nicht als 4 aus
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
Die folgende Funktion wurde verwendet, um das obige zu erzeugen.
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);
Her mit den Feiertagen…
9875300cookie-checkArbeitstage berechnenyes
Dafür habe ich eine anständige Bibliothek erstellt. github.com/andrejsstepanovs/business-days-calculator Es ist stabil und bereit, in die Produktion zu gehen.
– Wurmstich
6. Januar 2015 um 10:59 Uhr
Oh, ich denke, wir sollten erwähnen, dass wir heutzutage die Funktion DateTime::modify verwenden können, um Wochentage sofort hinzuzufügen: $my_date = new \DateTime(); $my_date->modify(“+ 7 Wochentag”); wird einfach nahtlos funktionieren.
– Micha
9. April 2015 um 11:04 Uhr
Ein ausführlicher Blog: goo.gl/YOsfPX
– Suresh Kamrushi
14. Januar 2016 um 8:51 Uhr
Eine einfachere/sauberere Antwort: stackoverflow.com/questions/5532002/…
– David
13. Januar 2018 um 17:29 Uhr