Bernd: Arbeitende berechnen

Moin,

warum komme ich mit dieser Rechnung nicht weiter?

// Start: 08:30
// Stunden: 6
$vslArbeitsende = $start + $stunden;

echo $vslArbeitsende;
// 14:00

Wo sind meine 30 Minuten und was mache ich falsch?

  1. Moin,

    warum komme ich mit dieser Rechnung nicht weiter?

    // Start: 08:30
    // Stunden: 6
    $vslArbeitsende = $start + $stunden;
    
    echo $vslArbeitsende;
    // 14:00
    

    Wo sind meine 30 Minuten und was mache ich falsch?

    Kleiner Tipp: 08:30 heißt nicht 8 geteilt durch 30. MFG

  2. Tach!

    warum komme ich mit dieser Rechnung nicht weiter?

    // Start: 08:30
    // Stunden: 6
    $vslArbeitsende = $start + $stunden;
    
    echo $vslArbeitsende;
    // 14:00
    

    Wo sind meine 30 Minuten und was mache ich falsch?

    Du rechnest numerisch mit Strings. Aber eigentlich möchtest du mit Datum und Zeit rechnen. PHP kann nicht aus dem String 08:30 einfach so erkennen, dass das eine Uhrzeit sein soll und dass die 6 eine Anzahl Stunden darstellen soll. So versucht es einfach Zahlen zu erkennen und beschwert sich auch mit einer Notice, dass 08:30 keine gültige Zahl ist und nimmt davon soviel, wie es als Zahl zu interpretieren in der Lage ist, also die 08.

    Du möchtest stattdessen mit DateTime für Datum/Uhrzeiten und mit DateInterval für Zeitdauern arbeiten. DateTime hat dann auch eine Methode add, mit der man ein DateIntervall hinzufügen kann, um zu einer neuen Uhrzeit (oder Datum) zu kommen.

    dedlfix.

    1. Hallo,

      danke für deine Erklärung, so bekomme ich jetzt 14:30 Uhr raus

      $stunden = "6";
      
      $start = DateTime::createFromFormat('H:i', '08:30');
      $start->add(new DateInterval('PT'.$stunden.'H'));
      
      echo $start->format('H:i');  
      
      1. Leider geht es doch noch nicht richtig. Wenn ich mit vollen Stunden arbeite geht es problemlos, wenn ich z.B. 6,25 Stunden oder auch 6.25 Stunden rechnen möchte bekomme ich einen Fehler

        Fatal error: Uncaught Exception: DateInterval::__construct(): Unknown or bad format (PT6.25H)

        1. Tach!

          Leider geht es doch noch nicht richtig. Wenn ich mit vollen Stunden arbeite geht es problemlos, wenn ich z.B. 6,25 Stunden oder auch 6.25 Stunden rechnen möchte bekomme ich einen Fehler

          Fatal error: Uncaught Exception: DateInterval::__construct(): Unknown or bad format (PT6.25H)

          Das Format kann nur ganze Stunden ausdrücken - und ganze Minuten - etc. Die richtige Schreibweise wäre also PT6H15M

          dedlfix.

          1. Ok, das heißt ich muss die Stunden beim . aufteilen

            
            $stunden = "6.25";
            $trennen = explode('.', $stunden);
            
            $start = DateTime::createFromFormat('H:i', '08:30');
            $start->add(new DateInterval('PT'.$trennen[0].'H'.$trennen[1].'M'));
            
            echo $start->format('H:i');     
            

            Jetzt erhalte ich 14:55, was laut Rechnung zwar richtig ist, aber nicht für meine Ausgabe. Das heißt ich muss jetzt auch noch die 25, 50, 75 in 15, 30, 45 umwandeln.

            Gibt es da nichts einfacheres?

            1. Meine Ergebnis sähe dann so aus

              $stunden = "6.25";
              
              if ($trennen[1] == "25") {
              	$minuten = "15";
              } elseif ($trennen[1] == "50") {
              	$minuten = "30";
              } elseif ($trennen[1] == "75") {
              	$minuten = "45";
              }
              else {
              	$minuten = "00";
              }
              
              $trennen = explode('.', $stunden);
              
              $start = DateTime::createFromFormat('H:i', '08:30');
              $start->add(new DateInterval('PT'.$trennen[0].'H'.$minuten.'M'));
              
              echo $start->format('H:i');  
              
              1. Tach!

                Meine Ergebnis sähe dann so aus

                $stunden = "6.25";
                
                if ($trennen[1] == "25") {
                	$minuten = "15";
                } elseif ($trennen[1] == "50") {
                	$minuten = "30";
                } elseif ($trennen[1] == "75") {
                	$minuten = "45";
                }
                else {
                	$minuten = "00";
                }
                

                Es kann ja gut sein, dass bei dir nur diese 4 Werte relevant sind, aber ich hätte das trotzdem als generische Formel geschrieben, statt jeden Wert einzeln zu bedenken. Es sei denn, es sich wichtig, dass Angaben abweichend von 25/50/75 zu 0 werden.

                dedlfix.

                1. Es kann ja gut sein, dass bei dir nur diese 4 Werte relevant sind, aber ich hätte das trotzdem als generische Formel geschrieben

                  @Bernd

                  Hab ich mal versucht: "Zeitangaben normalisieren" timeS2timeF();

                  Der letzte Test berechnet die Arbeitszeit aus Zeug wie

                  Beginn: 08:00, Az: 8,75h

                  (auch aus: beginn: 22:00, Az: 8,75h - dann musst Du aber das Ausgabeformat bestimmen wenn der Tageswechsel sichtbar werden soll.)

                  1. Hello,

                    hast Du dabei auch das Arbeitszeitgesetz und seine Pausenregelung berücksichtigt?

                    Glück Auf
                    Tom vom Berg

                    --
                    Es gibt nichts Gutes, außer man tut es!
                    Das Leben selbst ist der Sinn.
                    1. Hallo,

                      hast Du dabei auch das Arbeitszeitgesetz und seine Pausenregelung berücksichtigt?

                      betrifft aber nur Festangestellte.

                      1. Hallo Bernd,

                        hast Du dabei auch das Arbeitszeitgesetz und seine Pausenregelung berücksichtigt?

                        betrifft aber nur Festangestellte.

                        Wie kommst du darauf?

                        Bis demnächst
                        Matthias

                        --
                        Pantoffeltierchen haben keine Hobbys.
                        ¯\_(ツ)_/¯
                        1. Weil einer freier Mitarbeiter arbeiten kann und darf soviel wie er möchte. Da bin ich nicht für verantwortlich ob er Pause einhält oder nicht.

                          1. Hallo Bernd,

                            Weil einer freier Mitarbeiter arbeiten kann und darf soviel wie er möchte.

                            Das mag wohl stimmen, allerdings gibt es neben freien Mitarbeitern auch befristet Angestellte oder Praktikanten, die ebenfalls keine fest Angestellten sind.

                            Bis demnächst
                            Matthias

                            --
                            Pantoffeltierchen haben keine Hobbys.
                            ¯\_(ツ)_/¯
            2. Tach!

              Das heißt ich muss jetzt auch noch die 25, 50, 75 in 15, 30, 45 umwandeln. Gibt es da nichts einfacheres?

              Ich habe nichts gefunden (aber auch nicht alles von Date/Time-Kapitel im Handbuch gelesen).

              Es gibt DateInterval::createFromDateString(), das kann sowas wie

              DateInterval::createFromDateString('6 hours');
              

              aber keine krummen Angaben.

              dedlfix.

            3. Hallo Bernd,

              Ok, das heißt ich muss die Stunden beim . aufteilen

              
              $stunden = "6.25";
              $trennen = explode('.', $stunden);
              
              $start = DateTime::createFromFormat('H:i', '08:30');
              $start->add(new DateInterval('PT'.$trennen[0].'H'.$trennen[1].'M'));
              
              echo $start->format('H:i');     
              

              Jetzt erhalte ich 14:55, was laut Rechnung zwar richtig ist, aber nicht für meine Ausgabe.

              Im Kontext, dass auf die Ausgangszeit 8:30 Uhr eine Zeitdauer von 6,25 Stunden (6:15 Stunden) addiert wird, ist 14:55 Uhr nicht richtig.

              Das heißt ich muss jetzt auch noch die 25, 50, 75 in 15, 30, 45 umwandeln.

              Gibt es da nichts einfacheres?

              Mach das doch allgemein, so dass es auch mit 6,42 oder 5,23 Stunden klarkommt:

              $bruchteil = '0.' . $trennen[1];
              $minuten = 60. * $bruchteil;
              

              Viele Grüße
              Robert

              1. Tach!

                Gibt es da nichts einfacheres?

                Mach das doch allgemein, so dass es auch mit 6,42 oder 5,23 Stunden klarkommt:

                $bruchteil = '0.' . $trennen[1];
                $minuten = 60. * $bruchteil;
                

                Dieses Prinzip meinte ich auch mit generische Formel. Aber zum einen ist der Punkt hinter 60 überflüssig (wohl nur ein unbemerkter Tippfehler). Zum anderen wird man noch das Ergebnis auf ganze Zahlen (ab)runden wollen. Im vorliegenden Beispiel mit 25/50/75 vs. 15/30/45 wird das nicht weiter auffallen, aber bei anderen Bruchteilen schon. Und dann hat man wieder das Problem, dass nichtganzzahlige Werte nicht akzeptiert werden.

                dedlfix.

  3. Hello,

    warum komme ich mit dieser Rechnung nicht weiter?

    Weil Computer meistens genauso blöd sind, wie ihr Benutzer? ;-P

    // Start: 08:30
    // Stunden: 6
    $vslArbeitsende = $start + $stunden;
    
    echo $vslArbeitsende;
    // 14:00
    

    Wo sind meine 30 Minuten und was mache ich falsch?

    Guck dir mal die PHP-Funktion strtotime() an. Die kommt deinem Begehren schon sehr nahe.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
  4. Hallo,

    ich begreife jetzt erst, dass es gar nicht um unberechenbare Arbeitende geht, sondern das Arbeitsende gemeint ist...

    Gruß
    Kalk