Datum/Uhrzeit rückwarts unter Berücksichtigung der Arbeitszeit und Wochenende rechnen

djnelly

Erfahrenes Mitglied
Hallo Community,

ich habe eine Aufgabe hier liegen und weiß nicht so recht, wie ich das lösen soll.

Beispiel:
Ein Auftrag dauert 1230 Minuten/20,5 Stunden. Um diesen zu erfüllen, muss ein weiterer Auftrag vorher über 1920 Minuten/32 Stunden erledigt werden. Gearbeitet wird werktags von 06:00 bis 22:00 Uhr.

Ich muss also die Zeit von Freitag 22:00 Uhr rückwärts rechnen. Unter Berücksichtigung vom Wochenende.

In diesem Beispiel würde das so aussehen:
Start Freitag, 02.02.18 22:00 Uhr
- 1230 Minuten Arbeitszeit = Donnerstag, 01.02.18 17:30 Uhr
(16 Stunden auf Freitag, Rest 4,5 Stunden auf Donnerstag schieben und ab 22:00 Uhr rechnen)

Nächster Auftrag ab Donnerstag, 01.02.18 17:30 Uhr
- 1920 Minuten Arbeitszeit = Mittwoch, 31.01.18 07:30 Uhr
(11,5 Stunden auf Donnerstag 17:30 bis 06:00 Uhr; Rest 20,5 Stunden auf den Tag davor ab 22 Uhr)

Jetzt kann es ja aber auch passieren, dass im beim Montag lande. Dann müsste ich mit dem Freitag der Vorwoche weiterrechnen und nicht mit dem Wochenendtagen.

Ich hoffe, mir kann jemand helfen?!?!?

Vielen Dank
 
Hallo,

ein sehr interessantes Thema. Wo brauchst du jetzt genau unsere Hilfe? Ohne jetzt fertigen Code geschrieben zu haben, würde ich wie folgt rangehen.

  • ein Werktag mit der Arbeitszeit von 06:00 - 22:00 hat 960 Minuten
  • Aus deinem Text kam nicht hervor, ob ein Projekt immer zu 22:00h endet oder auch untertätgig enden kann. Im ersten Schritt würde ich die Zeit Zwischen Projektende und Tagesstart (06:00) berechnen. Ist diese Zahl größer als die Projektdauer, endet das Projekt am selben Tag und du musst nur die Uhrzeit berechnen. Ist sie größer, dann ziehst du die berechnete Zeit von der Projektdauer ab und gehst einen Tag zurück
  • So gehst du über eine while-Schleife durch, bis die restliche Projektzeit kleiner ist als die oben genannten 960 Minuten. Dann hast du deinen Tag und musst nur noch die Uhrzeit errechnen.
  • Nun zu der Problematik mit dem Wochentag.Ich würde ein Array mit der Wochentagnummer definieren (1=Montag; 7=Sonntag) und dort die entsprechenden Tage eintragen (In deinem Fall Montag - Freitag). Über die Funktion date() kannst du den Wochentag ermitteln (siehe hier; beachte bitte aber statt "w" "N" zu verwenden, da w Sonntag bis Samstag 8(0-6) und N Montag bis Sonntag (1-7) ausgibt; sieher hierzu http://php.net/manual/de/function.date.php)
  • Wenn du jetzt deine Schleife durchläufst und ein Tag abziehen muss (Projektlaufzeit >=960 Minuten), dann musst du schauen, ob dieser neue Tag in deinem Array steht. Wenn dem so ist, kannst du die Laufzeit um die Minutenzahl reduzieren. Wenn nicht, dann reduzierst du die Restlaufzeit nicht und durchläufst die Schleife erneut mit dem neuen Datum.
  • Am Ende kommst du auf ein Zeitpunkt, wo das Projekt beginnen soll.
  • Jetzt stellt sich noch die Frage, ob das vorhergehende Projekt mit dem soeben berechneten Gewinn enden soll oder ob zwischen beiden Projekten ein Puffer liegen muss kann ich aus dem Text nicht schlussfolgern
Ich hoffe, ich habe mich für die Uhrzeit verständlich ausgedrückt :D
 
Guten Morgen!

danke für deine Worte. Ich habe da gestern auch nochmal drüber nachgedacht. Wir war nicht ganz klar, wie ich da rangehen soll. Aber du hast mich bestätigt. Vielen Dank!

Für alle, die es interessiert, hier ein erster Entwurf, den sich jeder ausbauen oder erweitern kann:

PHP:
$ArbeitszeitBeginn = 6;
$ArbeitszeitEnde = 22;
$OhneWochenende = "Y";

$AktuellesDatum = "2018-02-06";
$AktuelleUhrzeit = "22";
$StundenZuRechnen = 44.5;

while(0 < $StundenZuRechnen) {
    echo "Reststunden: ".$StundenZuRechnen."<br>";
   
    //Reststunden des Tages
    $VerfuegbareZeit = $AktuelleUhrzeit - $ArbeitszeitBeginn;
    echo "Verfügbare Zeit: ".$VerfuegbareZeit."<br>";
   
    //Falls Datum auf ein WE fällt
    echo "Wochentag: ".date("w", strtotime("-1 day", strtotime ($AktuellesDatum)) )."<br>";
   
    if(date("w", strtotime("-1 day", strtotime ($AktuellesDatum)) ) == "0" && $OhneWochenende == "Y") {
        $AktuellesDatum = date("Y-m-d", strtotime("-3 day", strtotime ($AktuellesDatum)) );
    } else if(date("w", strtotime("-1 day", strtotime ($AktuellesDatum)) ) == "6" && $OhneWochenende == "Y") {
        $AktuellesDatum = date("Y-m-d", strtotime("-2 day", strtotime ($AktuellesDatum)) );
    } else {
        $AktuellesDatum = date("Y-m-d", strtotime("-1 day", strtotime ($AktuellesDatum)) );
    }
       
    if($StundenZuRechnen > $VerfuegbareZeit) {
        $AktuelleUhrzeit = $ArbeitszeitEnde;
        $StundenZuRechnen = $StundenZuRechnen - $VerfuegbareZeit;
        echo "Reststunden ".$StundenZuRechnen."<br>";
    } else {
        //Uhrzeit kürzen
        $AktuelleUhrzeit = $ArbeitszeitEnde - $StundenZuRechnen;
        $StundenZuRechnen = 0;
        echo "Reststunden ".$StundenZuRechnen."<br>";
    }


    echo "Aktuelles Datum: ".$AktuellesDatum."<br>";
    echo "<br>";

}

echo "End-Datum: ".$AktuellesDatum."<br>";
echo "End-Uhrzeit: ".str_replace(".5", ":30", $AktuelleUhrzeit)." Uhr<br>";
 
Zurück