Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 28-04-2017, 02:40
andyB
 Registrierter Benutzer
Links : Onlinestatus : andyB ist offline
Registriert seit: Apr 2005
Ort: Hamburg, Germany
Beiträge: 27
andyB ist zur Zeit noch ein unbeschriebenes Blatt
Standard Zeitspannenberechnung

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:
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(000date('m',$start), date('d',$start)+1date('Y',$start)) ) {
                
/* $ende auf 0 Uhr festlegen */
                
$night1_1 mktime(000date('m',$start), date('d',$start)+1date('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(2000date('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(000date('m',$start), date('d',$start)+1date('Y',$start)) ) {
                
/* liegt $ende nach 4 Uhr? */
                
if ($ende mktime(400date('m',$start), date('d',$start)+1date('Y',$start))) {
                    
/* $night2 auf 4 Uhr setzen */
                    
$night2 4;
                }
                else {
                    
/* Stunden zwischen 0 Uhr und 4 Uhr berechnen */
                    
$night2 = ($ende mktime(000date('m',$start), date('d',$start)+1date('Y',$start)))/3600;
                }
            }
            else {
                
$night2 0;
            }
            
/* Ergebnis ins Ausgabe-Array eintragen */
            
$surcharges['night2'] += $night2;
        }
    }
    
/* Ergebnis zurückgeben */
    
return $surcharges;

Folgende Daten bekomme ich:
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
); 
Aufruf der Funktion:
PHP-Code:
surcharges($data['date'], $data['shift'], $holidays); 
und das Ergebnis sollte im Falle der obigen Daten wie folgt aussehen:
PHP-Code:
/* erwartetes Ergebnis */
Array
(
    [
night1] => 4
    
[night2] => 1.5
    
[sunday] =>
    [
holiday] =>
)

/* tatsächliches Ergebnis */
Array
(
    [
night1] => 0
    
[night2] => 0
    
[sunday] =>
    [
holiday] =>

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.
Mit Zitat antworten