PHP Script Überstunden - Problem mit Zeitrechnung
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
arbeitszeit
beginn
betrag
code
dank
date
dauer
ende
ergebnis
fehler
minute
nehmen
pause
saldo
sekunde
stunden
summe
umrechnung
umwandeln
url
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hat das eventuell mit dem hier zu tun?
-
pasi-b schrieb:
OK, ich sehe jetzt auch schon den Fehler
Aber danke trotzdem.
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
kleiner 28800 ist musst du den Betrag ($dauer_stamp
) davon nehmen und das als "fehlende Stunden" statt Überstunden bezeichnenabs()
-
hackyourlife schrieb:
pasi-b schrieb:
OK, ich sehe jetzt auch schon den Fehler
Aber danke trotzdem.
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
kleiner 28800 ist musst du den Betrag ($dauer_stamp
) davon nehmen und das als "fehlende Stunden" statt Überstunden bezeichnenabs()
Hab die Variable jetzt mal ganz umgemodet, und in "summe" umbenannt.
Leider gibt er mir jetzt die Arbeitszeit als Überstunden aus.
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.
-
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
rechne, funktioniert alles bestens, wenn du noch das beachtest, was hackyoulife sagt:$dauer_stamp = $ende_stamp - $beginn_stamp - 45*60;
Du berechnest
$saldo = $dauer_stamp - 28800;
wenn $saldo < 0 ist, gibt es logischerweise dann keine Überstunden. -
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 -
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 -
-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.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage