Datumsberechnung ohne Wochenenden und Feiertage

HammerHe@rt

Erfahrenes Mitglied
Habe folgendes Problem:
Wie schaffe ich es ausgehen vom aktuellen Datum (Mo.-Fr.) den nächsten Termin (in X Arbeitstagen) zu berechnen?

Bsp.

Heute: Dienstag der 20.Mai 2008
in 10 Arbeitstagen: Dienstag der 03.Juni 2008
in 20 Arbeitstagen: ....
in 30 Arbeitstagen: ....

Feiertage sollen auch quasi übersrungen werden!

Im Moment sollen ersteinmal die 10/20/30 fest sein !
Ich steh im Moment irgendwie aufn Schlauch.
 
Da eine Woche nur sechs Werktage hat, berechnest du erst einmal, wie viele volle Wochen benötigt werden. Zu diesen kommt dann noch die restlichen Tage, also die Differenz der Anzahl der vollen Wochen multipliziert mit sechs und der Gesamtzahl der Werktage. Also:
PHP:
$n = 10;
$w = floor($n/6);
var_dump( time() + ($w*7+$n%($w*6))*86400 );
Wenn du zusätzlich noch Feiertage berücksichtigen möchtest, kannst du einfach schauen, wie viele der Feiertage in diesem Zeitraum liegen und erhöhst den $n-Wert entsprechend.
 
Mehrere Feiertage müsste man in einer Schleife dann bearbeiten oder?
PHP:
$feiertag = mktime(0, 0, 0, 5, 22, 2008); // 22.5.2008

$start = time();
$ende = time() + ($w*7+$n%($w*6))*86400;

if( strtotime( $start ) <= strtotime( $feiertag )
    && strtotime( $ende ) >= strtotime( $feiertag )
  )
{
    $n++;
}
Geht bestimmt noch schöner, wenn Gumbo das macht :p
(Falls das überhaupt funktioniert was ich da tippe)

//edit: Das hier sieht auch gut aus: http://pear.php.net/manual/de/package.datetime.date-holidays.php
 
Zuletzt bearbeitet:
hab hier nen tip bekommen

schaut soweit ganz gut aus

Code:
function workingDays($daysGoal) {

//	Feiertags Array
	$holidays = array('2008-07-01','2008-06-16');

//  Arbeitstage Array, 0 = Samstag, 6 = Sonntag
	$workDays = array('1', '2', '3', '4', '5');

//	Anfangszeit -> aktuelles Datum
	$start = date("Y-m-d");

	$dayCounter = 1;
	$daysSoFar = 0;
	while( $daysSoFar < $daysGoal ) {
		$workingDate = strtotime("+$dayCounter days", strtotime("$start 12:00:00"));
			if( in_array(date("w",$workingDate),$workDays) ){
				if(!(in_array(date("Y-m-d", $workingDate), $holidays))){
					$daysSoFar++;
				}
			}
		$dayCounter++;
	}
	return date("d.m.Y",$workingDate); 
}

fehlt nur noch die ausgabe des korrekten wochentages in deutsch^^
 
Es müsste nicht nur geprüft werden, ob der Feiertag innerhalb des Zeitraumes liegt, sondern auch, ob der Feiertag auf einen Werktag fällt. Denn nur dann ist dieser für die Berechnung relevant.
Das muss in jedem Fall in einer Schleife geschehen, da es ja mehr als nur einen Feiertag gibt.
PHP:
$start = time();
$days = 10;
$holydays = array(
	mktime(0, 0, 0, 5, 22, 2008),
	mktime(0, 0, 0, 5, 23, 2008),
);

$start = ceil($start/86400)*86400-date('Z', $start);
$w = (int)date('w', $start);
for( $i=1, $n=$days; $i<$n; $i++ ) {
	if( in_array(($i+$w)%7, array(0)) ) {
		$n++;
		continue;
	}
	foreach( $holydays as $holyday ) {
		if( $holyday == ($start+$i*86400) ) {
			$n++;
		}
	}
}

var_dump($n);
 
Zurück