Zeitspannenberechnung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 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.

  • #2
    Es ist immer sehr hilfreich, wenn man sich mal alle benutzten Variablen per echo bzw- var_dump anzeigen lässt, denn so findet man Fehler.

    Kommentar


    • #3
      Hallo,

      habe es hinbekommen.
      Es lag an mehreren Faktoren. Zum Einen habe ich falsche Daten zum Verarbeiten bekommen, zum Anderen hatte meine Funktion Fehler...

      Die fertige Funktion:
      PHP-Code:
      /*
       * Berechnung
       * der Nachtzuschläge
       * der Sonn- und Feiertagszuschläge
       */
      function surcharges($date$timedata$holidays){
          
      $surcharges = array('night1'=>'','night2'=>'','sunday'=>'','holiday'=>'');
          
      $holiday in_array($date$holidays);
          
      $date_ts strtotime($date);

          for (
      $i=0$i count($timedata); $i++) { 
              
      $start $timedata[$i]['begin'];
              
      $ende $timedata[$i]['end'];

              if (
      $holiday) {
                  
      $surcharges['holiday'] = ($ende $start)/3600;
              }

              else if ( 
      date('N'strtotime($date)) === "7" ) {
                  
      $surcharges['sunday'] = (($ende $start)/3600);
              }

              else {
                  if ( 
      $ende mktime(000date('m',$start), date('d',$start)+1date('Y',$start)) ) {
                      
      $night1_1 mktime(000date('m',$start), date('d',$start)+1date('Y',$start));
                  }
                  else {
                      
      $night1_1 $ende;
                  }

                  if (
      date('H:i'$start) < "20:00") {
                      
      $night1_2 mktime(2000date('m',$start), date('d',$start), date('Y',$start));
                  }
                  else {
                      
      $night1_2 $start;
                  }

                  
      $night1_3 = ($night1_1 $night1_2)/3600;
                  if (
      $night1_3 <= 0) {
                      
      $surcharges['night1'] += 0;
                  }
                  else {
                      
      $surcharges['night1'] += $night1_3;
                  }
                  
                  if ( 
      $ende mktime(000date('m',$date_ts), date('d',$date_ts)+1date('Y',$date_ts)) ) {
                      if (
      $ende mktime(400date('m',$date_ts), date('d',$date_ts)+1date('Y',$date_ts))) {
                          
      $night2 4;
                      }
                      else {

                          if ( 
      $start mktime(000date('m',$date_ts), date('d',$date_ts)+1date('Y',$date_ts)) ) {
                              
      $night2 = ($ende mktime(000date('m',$date_ts), date('d',$date_ts)+1date('Y',$date_ts)))/3600;
                          }
                          else {
                              
      $night2 = ($ende $start)/3600;
                          }
                      }
                  }
                  else {
                      
      $night2 0;
                  }
                  
      $surcharges['night2'] += $night2;
              }
          }
          return 
      $surcharges;

      Diese funktioniert jetzt so wie sie soll.

      Hat vielleicht jemand noch eine Idee, wie die Funktion schlanker werden kann?

      Grüße.

      Kommentar

      Lädt...
      X