kostenloser Webspace werbefrei: lima-city


PHP Script Überstunden - Problem mit Zeitrechnung

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    pasi-b

    Kostenloser Webspace von pasi-b

    pasi-b hat kostenlosen Webspace.

    Hallo zusammen,

    ich möchte mir ein einfaches Script programmieren, bei dem ich ein Formular habe, indem ich Arbeitsbeginn und -ende eintrage, dieses Script mir die Pause abzieht und am Ende dann gesamte Arbeitszeit und Überstunden in eine Mysql-Tabelle schreibt.

    Ich kann alles umsetzen, es wird auch alles ausgegeben wie ich möchte, zumindest wenn ich Überstunden mache. Wenn ich mal früher gehe, tritt ein Fehler im Script aus, und es zeigt mir Überstunden die ich angeblich gemacht haben sollte an, obwohl ich ja früher gegangen bin. Es wird einfach ein Fehler bei der Umsetzung des Scripts sein, jedoch habe ich keine Ahnung wie man sowas berechnet oder nach was ich suchen soll. Wäre über eure Hilfe dankbar!

    setlocale(LC_TIME, "de_DE");
    	$tage = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
    	$tag = date("w");
    
    	
    	#Beginn der Arbeitszeit
    			$beginn_stamp = strtotime($_POST['beginn'], date_default_timezone_set('UTC')); 
    		#Ende der Arbeitszeit
    			$ende_stamp = strtotime($_POST['ende'], date_default_timezone_set('UTC'));
    		#Differenz ausrechnen
    			$dauer_stamp_raw = $ende_stamp - $beginn_stamp; 
    			$dauer_raw = date("G:i", $dauer_stamp_raw);
    		#Pause abziehen
    			$dauer_stamp = $ende_stamp - $beginn_stamp - strtotime($_POST['pause']); 
    			$dauer = date("G:i", $dauer_stamp); 
    			$saldo = date("G:i", $dauer_stamp - 28800);
    			
    			
    			echo "Start: ".$_POST['beginn']."<br />";
    			echo "Ende: ".$_POST['ende']."<br />";
    			echo "Arbeitszeit: ".$dauer."<br />";
    			echo "Überstunden: ".$saldo;



    Hier als Demo: http://pasib.minecraft-area.de/ueberstunden/home.php

    Gruß,

    Pascal

    Beitrag zuletzt geändert: 7.11.2012 18:07:20 von pasi-b
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Hat das eventuell mit dem hier zu tun?
  4. Autor dieses Themas

    pasi-b

    Kostenloser Webspace von pasi-b

    pasi-b hat kostenlosen Webspace.

    hackyourlife schrieb:
    Hat das eventuell mit dem hier zu tun?


    Ich denke nicht, in dem Thema geht es ja um die Sommer- und Winterzeit, das Problem hab ich gelöst.
    Aber danke trotzdem.
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    pasi-b schrieb:
    Aber danke trotzdem.
    OK, ich sehe jetzt auch schon den Fehler ;-)

    Da du Datumsfunktionen zur Umrechnung von Sekunden in Stunden benutzt muss dir klar sein, dass du wenn du einen negativen Timestamp angibst das Ergebnis von 24:00 - Stunden ausgegeben wird…

    Lösung:
    Wenn
    $dauer_stamp
    kleiner 28800 ist musst du den Betrag (
    abs()
    ) davon nehmen und das als "fehlende Stunden" statt Überstunden bezeichnen ;-)
  6. Autor dieses Themas

    pasi-b

    Kostenloser Webspace von pasi-b

    pasi-b hat kostenlosen Webspace.

    hackyourlife schrieb:
    pasi-b schrieb:
    Aber danke trotzdem.
    OK, ich sehe jetzt auch schon den Fehler ;-)

    Da du Datumsfunktionen zur Umrechnung von Sekunden in Stunden benutzt muss dir klar sein, dass du wenn du einen negativen Timestamp angibst das Ergebnis von 24:00 - Stunden ausgegeben wird…

    Lösung:
    Wenn
    $dauer_stamp
    kleiner 28800 ist musst du den Betrag (
    abs()
    ) davon nehmen und das als "fehlende Stunden" statt Überstunden bezeichnen ;-)


    Hab die Variable jetzt mal ganz umgemodet, und in "summe" umbenannt.

    Leider gibt er mir jetzt die Arbeitszeit als Überstunden aus. :confused:

    if($dauer_stamp < 28800){
    				$summe = date("G:i", abs($dauer_stamp) - 28800);
    			}else{
    				$summe = date("G:i", $dauer_stamp - 28800);
    			}



    Wenn ich es so mache:

    if($dauer_stamp < 28800){
    				$summe = abs($dauer_stamp);
    			}else{
    				$summe = date("G:i", $dauer_stamp - 28800);
    			}


    ... dann wird mir glaube ich der timestamp als Überstunden ausgegeben.
  7. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Jap, du hast einen anderen Fehler drin, weil ich auch gerade an dem Skript 'rumgespielt habe:
    $dauer_stamp = $ende_stamp - $beginn_stamp - strtotime($_POST['pause']);

    Das ist nicht, was du willst! Du ziehst hier den Timestamp vom 0 Uhr 45 ab und nicht 45 Minuten in Sekunden umgerechnet!!
    Wenn ich für 45 Minuten beispielsweise
    $dauer_stamp = $ende_stamp - $beginn_stamp - 45*60;
    rechne, funktioniert alles bestens, wenn du noch das beachtest, was hackyoulife sagt:
    Du berechnest
    $saldo = $dauer_stamp - 28800;

    wenn $saldo < 0 ist, gibt es logischerweise dann keine Überstunden.
  8. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Nein, so nicht ;-)

    Überleg mal: ein kleinerer Wert als 28800 - 28800 = ein Wert kleiner 0. Das ruft das falsche Ergebnis bei der date-Funktion hervor.

    Wie ich es gemeint habe:
    $n = $dauer_stamp - 28800;
    $stunden = date('G:i', abs($n)); // den Betrag von $n nehmen (immer positiv)
    if($n < 0)
    	zu wenig gearbeitet, gib "$stunden zu wenig" o.ä. aus


    Beitrag zuletzt geändert: 7.11.2012 19:40:36 von hackyourlife
  9. Autor dieses Themas

    pasi-b

    Kostenloser Webspace von pasi-b

    pasi-b hat kostenlosen Webspace.

    Danke euch, funktioniert jetzt alles super.
    Aber wie könnte ich jetzt die Überstunden bzw. Minussstunden wie z.B -0,95 wieder in eine Zeit umwandeln, ohne dass ich wieder die gleichen Probleme bekomme, oder geht das gar nicht?

    €: Beitrag von hackyourlife erst danach gesehen
    €: Danke, hab das jetzt erstmal so provisorisch gelöst, ich hoffe ich kann dann weiter Programmieren daran. :)
    Vielen Dank für die Zeit und Hilfe

    Gruß

    Beitrag zuletzt geändert: 7.11.2012 19:54:54 von pasi-b
  10. -0,95 Stunden sind 0,95*60 = 57 minuten, wenn der Wert größer ist musst du den Ganzzahligen Anteil abtrennen und als Stunden ausgeben und den gebrochenen Anteil wie eben gezeigt in Minuten umwandeln, der Modulo Operator dürfte helfen.
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!