Networkdays() in php

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!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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!

1
echo networkdays("02.10.2013","25.10.2013");

Liefert: 17

Feiertage in ein Array setzen:

1
$feiertage = array("03.10.2013","10.10.2013");

Anwendung:

1
echo networkdays("02.10.2013","25.10.2013",$feiertage);

Liefert: 15

One Comment

  1. 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) {

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.