Nützliche Codeschnipsel – Arbeitstage zwischen zwei Datumsangaben mit Zend_Date berechnen

Hier mal eine eine kleine Klasse, um die Anzahl zwischen zwei Datumsangaben zu berechnen.
Es werden allerdings nur bundesweite Feiertage berücksichtigt. Wenn man auch Feiertage in einzelnen Bundesländern berücksichtigen möchte, kann man einfach die Variable $_nationalHolidays entsprechend anpassen.
Achtung: Die Klasse setzt eine Umgebung voraus, in der das Zend Framework per Autoload geladen werden kann.

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
class MyCalenderUtils
{
 
    const DATE_FORMAT_DAY = 'dd.MM';
 
    /**
     * @var array
     */
    protected $_holidays = array();
 
    /**
     * @var array
     */
    protected $_nationalHolidays = array(
        '01.01', // Neujahr
        '01.05', // 1. Mai
        '03.10', // Tag der Einheit
        '25.12', // Weihnachten
        '26.12', // Weihnachten
    );
 
    /**
     * @param $year
     * @return $this
     */
    public function setHolidays($year)
    {
        $this->_holidays[$year] = array_merge($this->_nationalHolidays, $this->getEasterDays($year));
        return $this;
    }
 
    /**
     * @param $year
     * @return array
     */
    public function getHolidays($year)
    {
        if (!isset($this->_holidays[$year])) {
            $this->setHolidays($year);
        }
        return $this->_holidays[$year];
    }
 
    /**
     * @param $year
     * @return array
     */
    public function getEasterDays($year)
    {
        // ab PHP 5.3. könnte man auch die DateTime API von PHP nutzen
        $eastern          = new Zend_Date(easter_date($year));
        $a_eastern_days   = array();
        $a_eastern_days[] = $eastern->copyPart(null)->subDay(2)->toString(self::DATE_FORMAT_DAY); // Karfreitag
        $a_eastern_days[] = $eastern->copyPart(null)->addDay(1)->toString(self::DATE_FORMAT_DAY); // Ostermontag
        $a_eastern_days[] = $eastern->copyPart(null)->addDay(39)->toString(self::DATE_FORMAT_DAY); // Himmelfahrt
        $a_eastern_days[] = $eastern->copyPart(null)->addDay(50)->toString(self::DATE_FORMAT_DAY); // Pfingstmontag
        return $a_eastern_days;
    }
 
    /**
     * @param Zend_Date $date
     * @return bool
     */
    public function isHoliday(Zend_Date $date)
    {
        if (in_array($date->toString(self::DATE_FORMAT_DAY), $this->getHolidays($date->toString(Zend_Date::YEAR)))) {
            return true;
        }
        return false;
    }
 
    /**
     * @param $date
     * @return bool
     */
    public function isWeekend($date)
    {
        // nur Samstag und Sonntag beginnen mit einen 'S' ;-)
        if ($date->toString(Zend_Date::WEEKDAY_NARROW) == 'S')
        {
            return true;
        }
        return false;
    }
 
    /**
     * @param Zend_Date $date
     * @return bool
     */
    public function isWorkday(Zend_Date $date)
    {
        // prüfen ob Wochenende oder Feiertag
        if ($this->isWeekend($date) || $this->isHoliday($date)) {
            return false;
        }
        return true;
    }
}

Beispiel für die praktische Anwendung der Klasse:

1
2
3
4
5
6
7
8
9
10
$dateFrom = new Zend_Date('2014-03-10');
$dateTo   = new Zend_Date('2014-04-30');
$dayCounter = 0;
$myCalenderUtils = new MyCalenderUtils();
while ($dateTo->isLater($dateFrom->addDay(1))) {
    if ($myCalenderUtils->isWorkday($dateFrom)) {
       $dayCounter++;
    }
};
print "Arbeitstage: " . $dayCounter . "\n";
Dieser Beitrag wurde unter PHP abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Die Kommentarfunktion ist geschlossen.