Guten Tag,
ich bin gerade an einer Funktion zur Berechnung von SFN-Zuschlägen.
Berechnet werden sollen die Stunden die zwischen 20:00 Uhr und 0:00 Uhr liegen, sowie die Stunden zwischen 0:00 Uhr und 4:00.
An Sonn- und Feiertagen werden keine Nachtstunden berechnet.
Die Funktion:
Folgende Daten bekomme ich:
Aufruf der Funktion:
und das Ergebnis sollte im Falle der obigen Daten wie folgt aussehen:
Das Problem: egal welche Daten ich übergebe, ich bekomme immer 0 Stunden und finde das Problem nicht. Wahrscheinlich ist es zu offensichtlich...
Für einen Hinweis, wie ich das Problem lösen kann, wäre ich dankbar.
Gruß
andyB.
ich bin gerade an einer Funktion zur Berechnung von SFN-Zuschlägen.
Berechnet werden sollen die Stunden die zwischen 20:00 Uhr und 0:00 Uhr liegen, sowie die Stunden zwischen 0:00 Uhr und 4:00.
An Sonn- und Feiertagen werden keine Nachtstunden berechnet.
Die Funktion:
PHP-Code:
function surcharges($date, $timedata, $holidays){
$surcharges = array('night1'=>'','night2'=>'','sunday'=>'','holiday'=>'');
/* fällt $date auf ein Feiertag? */
$holiday = in_array($date, $holidays);
for ($i=0; $i < count($timedata); $i++) {
$start = $timedata[$i]['begin'];
$ende = $timedata[$i]['end'];
/* Feiertagsstunden */
/* wenn Feiertag, dann alle Stunden in $surcharges['holiday'] */
if ($holiday) {
$surcharges['holiday'] += ($ende - $start)/3600;
}
/* Sonntagsstunden */
/* ist $date ein Sonntag? Dann alle Stunden in $surcharges['sunday'] */
else if ( date('N', strtotime($date)) === "7" ) {
$surcharges['sunday'] += (($ende - $start)/3600);
}
/* wenn $date kein Feiertag und kein Sonntag ist */
/* Nachtstunden berechnen */
else {
/* liegt $ende nach 0 Uhr? */
if ( $ende > mktime(0, 0, 0, date('m',$start), date('d',$start)+1, date('Y',$start)) ) {
/* $ende auf 0 Uhr festlegen */
$night1_1 = mktime(0, 0, 0, date('m',$start), date('d',$start)+1, date('Y',$start));
}
else {
$night1_1 = $ende;
}
/* ist $start vor 20 Uhr? */
if (date('H:i', $start) < "20:00") {
/* $start auf 20 Uhr festlegen */
$night1_2 = mktime(20, 0, 0, date('m',$start), date('d',$start), date('Y',$start));
}
else {
$night1_2 = $start;
}
/* Stunden zwischen 20 Uhr & 0 Uhr berechnen */
$night1_3 = ($night1_1 - $night1_2)/3600;
/* Ergebnis ins Ausgabe-Array eintragen */
/* wenn $night1_3 negativ, auf 0 setzten */
if ($night1_3 <= 0) { $surcharges['night1'] += 0; }
else {
$surcharges['night1'] += $night1_3;
}
/* Stunden zwischen 0 Uhr und 4 Uhr berechnen */
/* liegt $ende nach 0 Uhr? */
if ( $ende > mktime(0, 0, 0, date('m',$start), date('d',$start)+1, date('Y',$start)) ) {
/* liegt $ende nach 4 Uhr? */
if ($ende > mktime(4, 0, 0, date('m',$start), date('d',$start)+1, date('Y',$start))) {
/* $night2 auf 4 Uhr setzen */
$night2 = 4;
}
else {
/* Stunden zwischen 0 Uhr und 4 Uhr berechnen */
$night2 = ($ende - mktime(0, 0, 0, date('m',$start), date('d',$start)+1, date('Y',$start)))/3600;
}
}
else {
$night2 = 0;
}
/* Ergebnis ins Ausgabe-Array eintragen */
$surcharges['night2'] += $night2;
}
}
/* Ergebnis zurückgeben */
return $surcharges;
}
PHP-Code:
$data = Array
(
[id] => 13854
[date] => 2017-03-04
[shift] => Array
(
[0] => Array
(
[begin] => 1488623400 // 2017-03-04 11:30
[end] => 1488634200 // 2017-03-04 14:30
[total] => 3.00
)
[1] => Array
(
[begin] => 1488735000 // 2017-03-04 18:30
[end] => 1488668400 // 2017-03-05 00:00
[total] => 5.50
)
[2] => Array
(
[begin] => 1488670200 // 2017-03-05 00:30
[end] => 1488675600 // 2017-03-02 02:00
[total] => 1.50
)
)
[shift_total] => 10.00
[department] => 2
[action] => nextday
);
PHP-Code:
surcharges($data['date'], $data['shift'], $holidays);
PHP-Code:
/* erwartetes Ergebnis */
Array
(
[night1] => 4
[night2] => 1.5
[sunday] =>
[holiday] =>
)
/* tatsächliches Ergebnis */
Array
(
[night1] => 0
[night2] => 0
[sunday] =>
[holiday] =>
)
Für einen Hinweis, wie ich das Problem lösen kann, wäre ich dankbar.
Gruß
andyB.
Kommentar