2016-03-24 7 views
-3

Für die Lieferung unseres Webshops müssen wir 5 Arbeitstage ab dem aktuellen Datum in PHP berechnen.Php 5 Arbeitstage zum aktuellen Datum addieren, ausgenommen Wochenenden (Sat-Sonne) und exklusive (mehrere) Feiertage

Unsere Arbeitstage sind von Montag bis Freitag und wir haben mehrere Ruhetage (Feiertage), die auch nicht enthalten sein können.

Ich habe dieses Skript gefunden, aber das beinhaltet keine Feiertage.

<?php 

    $_POST['startdate'] = date("Y-m-d"); 
    $_POST['numberofdays'] = 5; 

    $d = new DateTime($_POST['startdate']); 
    $t = $d->getTimestamp(); 

    // loop for X days 
    for($i=0; $i<$_POST['numberofdays']; $i++){ 

     // add 1 day to timestamp 
     $addDay = 86400; 

     // get what day it is next day 
     $nextDay = date('w', ($t+$addDay)); 

     // if it's Saturday or Sunday get $i-1 
     if($nextDay == 0 || $nextDay == 6) { 
      $i--; 
     } 

     // modify timestamp, add 1 day 
     $t = $t+$addDay; 
    } 

    $d->setTimestamp($t); 

    echo $d->format('Y-m-d'). "\n"; 

?> 
+0

Ohne den Versuch der Codierung werden Sie nicht bekommen. –

+0

Mögliches Duplikat von [PHP Datum ohne Wochenende] (http://stackoverflow.com/questions/24803897/php-date-excluding-weekend) – styks

Antwort

4

Sie können die "while-Anweisung" verwenden, Schleifen, bis Sie genug bekommen 5 Tage. Jedes Mal, wenn Sie eine Schleife bekommen, erhalten Sie &. Überprüfen Sie, ob der nächste Tag in der Feiertagsliste ist oder nicht.

Hier ist das das Beispiel:

$holidayDates = array(
    '2016-03-26', 
    '2016-03-27', 
    '2016-03-28', 
    '2016-03-29', 
    '2016-04-05', 
); 

$count5WD = 0; 
$temp = strtotime("2016-03-25 00:00:00"); //example as today is 2016-03-25 
while($count5WD<5){ 
    $next1WD = strtotime('+1 weekday', $temp); 
    $next1WDDate = date('Y-m-d', $next1WD); 
    if(!in_array($next1WDDate, $holidayDates)){ 
     $count5WD++; 
    } 
    $temp = $next1WD; 
} 

$next5WD = date("Y-m-d", $temp); 

echo $next5WD; //if today is 2016-03-25 then it will return 2016-04-06 as many days between are holidays 
+0

Danke. Ich werde versuchen, es zusammenzusetzen (musste gestern grundlegende PHP lernen; unser Entwickler ist krank ...), hoffe, es funktioniert :) – WBeke

+0

Ich kann es nicht funktionieren lassen; Muss ich das mit einer while-Schleife machen? – WBeke

+0

@WBeke Okay, ich aktualisierte die Antwort mit den Codes. Genießen!!! –

0

Eine Funktion basiert auf Tinh Dang Antwort:

function getFutureBusinessDay($num_business_days, $today_ymd = null, $holiday_dates_ymd = []) { 
    $num_business_days = min($num_business_days, 1000); 
    $business_day_count = 0; 
    $current_timestamp = empty($today_ymd) ? time() : strtotime($today_ymd); 
    while ($business_day_count < $num_business_days) { 
     $next1WD = strtotime('+1 weekday', $current_timestamp); 
     $next1WDDate = date('Y-m-d', $next1WD);   
     if (!in_array($next1WDDate, $holiday_dates_ymd)) { 
      $business_day_count++; 
     } 
     $current_timestamp = $next1WD; 
    } 
    return date('Y-m-d', $current_timestamp); 
} 

Ich habe es die Schleife bis 1000 Werktagen zu begrenzen. Es könnte keine Grenze geben, wenn gewünscht.

Verwandte Themen