Wer die Nettoarbeitstage() Funktion von Excel kennt weiß wie gut man diese gebrauchen kann. Networkdays() im englischen MS Excel.
Der Funktion werden Start und Enddatum gegeben, sowie optional eine Auflistung mit Feiertagen. Die Funktion liefert die seitdem vergangenen Werktage zurück.
Funktion
Hier ist eine Umsetzung der Funktion in php!
function networkdays($start, $end="", $freedays = "" ){
$s = date_parse($start);
if ($end == "") {
$end = date("d.m.Y",time());
}
$e = date_parse($end);
//Timestamps generieren für Start und Ende
$ts_start = mktime(0, 0, 0, $s["month"], $s["day"], $s["year"]);
$ts_end = mktime(0, 0, 0, $e["month"], $e["day"], $e["year"]);
//Wenn Start und Ende vertauscht -> vertauschen
if ($ts_end < $ts_start) {
$x = $ts_start;
$ts_start = $ts_end;
$ts_end = $x;
}
//Feiertage Array
if (is_array($freedays)) {
while ( $da = each($freedays) ) {
$d = date_parse($da['value']);
$ft[] = mktime(0, 0, 0, $d["month"], $d["day"], $d["year"]);
}
} else{
$ft = array();
}
//start
$days = 0;
while ( $ts_start < $ts_end) { //check den Wochentag! $wd = date("w",$ts_start); if ( !in_array($ts_start,$ft) ) { if ($wd > 0 and $wd < 6) {
$days++;
}
}
$ts_start = $ts_start + (60*60*24);
}
return $days;
}
Anwendung
Die Angabe eines Arrays mit Feiertagen ist optional!
echo networkdays("02.10.2013","25.10.2013");
Liefert: 17
Feiertage in ein Array setzen:
$feiertage = array("03.10.2013","10.10.2013");
Anwendung:
echo networkdays("02.10.2013","25.10.2013",$feiertage);
Liefert: 15
Im Vergleich zur Excel Funktion gibt es einen Bug, der letzte Tag wird nicht berücksichtigt. Ansonsten super, danke!
Änderungen von:
while ( $ts_start < $ts_end) {
In:
while ( $ts_start <= $ts_end) {