2010-11-23 11 views
39

Gibt es eine Möglichkeit, strtotime zu verwenden, um Arbeitstage (Montag bis Freitag) zu einem Datum hinzuzufügen? Oder eine andere Methode? Was ich tun möchte, ist:Arbeitstage (Mo-Fr) in PHP

date ('Y-m-j' , strtotime ('+3 working days')) 
+7

In einigen Ländern des Mittleren Ostens ein Wochenende eine Arbeitswoche von Sonntag bis Donnerstag ist. Habt ihr darüber nachgedacht: O –

+2

Das ist zum Ausarbeiten wie viele Tage in der Zukunft die Zahlungsfrist für ein lokales Event ist, also nein :-) – fredley

+0

Man muss auch an Ferien denken. – yvoyer

Antwort

79

Wenn Sie auf Wochentage beschränken verwenden Sie die Zeichenfolge Wochentage.

echo date ('Y-m-j' , strtotime ('3 weekdays')); 

Dies sollte Sie um 3 Wochentage voraus springen, wenn es also Donnerstag ist, wird es die zusätzliche Wochenendzeit hinzufügen.

Quelle: http://www.php.net/manual/en/datetime.formats.relative.php

+39

Nein * weg. * Das funktioniert? Gibt es etwas, das 'strtotime()' nicht kann? –

+0

@Pekka Ich habe gelegentlich durch seine Unfähigkeit Dinge wie "der erste Tag des Monats vor 10 Monaten" und "der erste Tag dieses Monats" geschraubt bekommen. – Yahel

+1

Es funktioniert aber fehlerhaft: 'Echo-Datum ('Y-m-d', strtotime ('2011-03-27 + 5 Wochentage'));' Voraussichtlich 1. April, erhielt 3. April. – zerkms

2

ich diesen Buggy gefunden zu haben, wenn eine größere Menge an Wochentagen zu benötigen. Ich habe nach X Tagen nach dem 1. des aktuellen Monats gesucht.

Sah zuerst gut aus, nachdem> 5 Werktage hinzugefügt wurden (ähnlich wie @zerkms).

Dies hat sich für mich als genauer erwiesen.

function _getBusinessDayOfMonth($days) { 
     $time = strtotime(date("m/1/Y 00:00")); //finding # of business days after 1st of the month 
     $i = 0; //start with zero 
     while ($i < $days) { //loop through until reached the amount of weekdays 
      $time = strtotime("+1 day", $time); //Increase day by 1 
      if (date("N", $time) < 6) { //test if M-F 
       $i++; //Increase by 1 
      } 
     } 
     echo date("m/d/Y", $time); 
    } 
0

denke ich, eine Funktion kann leicht entwickelt werden, dass Sie gerade aktuellen Tag keine der Woche exportieren und Sie können zwei und mod von 5 hinzufügen, werden Sie leicht Wochentag geben.

Und Sie können den Wochentag-Namen exportieren, indem Sie ein Array verwenden, diese Methode kann alternativ verwendet werden.

0

ich es rekursiv tun, arbeitete für mich

function add_work_days($date, $day){ 
    if($day == 0) 
     return $date; 

    $date->add(new DateInterval('P1D')); 

    if(!in_array($date->format('N'), array('6', '7'))) 
     $day--; 

    return add_work_days($date, $day); 
} 

$date = add_work_days(new DateTime(), 3); 
echo $date->format('d/m/Y'); 
0

Für ältere Versionen von PHP < 5,3

function AddWorkingDays($startDate, $adddays) 
{ 
    $retdate = $startDate; 
    $sign = "+"; 
    if($adddays < 0){ 
    $adddays = $adddays*-1; 
    $sign = "-"; 
    } 
    while ($adddays > 0) { 
    $retdate = date ('Y-m-d' , strtotime ("$retdate {$sign}1 day")); 

     $what_day = date("N", strtotime($retdate)); 
     if ($what_day != 6 && $what_day != 7) // 6 and 7 are weekend 
      $adddays--; 

    }; 

    return $retdate; 

} 
Verwandte Themen