# Datumsberechnung ohne Wochenenden und Feiertage



## HammerHe@rt (20. Mai 2008)

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.


----------



## Gumbo (20. Mai 2008)

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:
	
	
	



```
$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.


----------



## Loomis (20. Mai 2008)

Mehrere Feiertage müsste man in einer Schleife dann bearbeiten oder?

```
$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 
(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


----------



## HammerHe@rt (20. Mai 2008)

hab hier nen tip bekommen

schaut soweit ganz  gut aus


```
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^^


----------



## metalalisa (20. Mai 2008)

nutze diese Funktion
http://php.net/manual/function.setlocale.php


----------



## Gumbo (20. Mai 2008)

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.
	
	
	



```
$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);
```


----------

