PHP Minusstunden und normale Stunden summieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
angabe
berechnung
code
dank
differenz
frage
gesamt stunden
gesamtzeit
kopf
minute
rechnen
sekunde
spalte
stunden
test
tip
url
verschiedene rechen
vorzeichen
zeitangabe
-
Hallo zusammen, (ja, ich schon wieder)
ich habe eine Tabelle mit einer Spalte in deren Zellen Werte wie
0:08 0:43 -0:22
usw. stehen.
Diese Werte sind Zeitangaben (Überstunden und Minusstunden).
Meine Frage: Wie kann ich diese Werte addieren und subtrahieren, sodass ich am Ende wieder einen solchen Zeitwert erhalte? Ich frage das so simpel ohne Code, da ich überhaupt keinen Anhaltspunkt habe.
Freue mich auf Antworten!
Gruß,
Pascal -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
denk nicht so umständlich, rechne alles in Stunden um, so wie es fatfox schon in einem anderen Zeitrechnungsthread empfohlen hat, und dann wandle es wieder zurück
0:08 = 0 Stunden + 0,133 Stunden für die umgerechneten Minuten (8 / 60)
0:43 = 0 Stunden + 0,717 Stunden für die umgerechneten Minuten
-0:22 = 0 Stunden + 0,367 Stunden für die umgerechneten Minuten
0,133+0,717-0,367 = 0,483 Stunden = 0:29, also 0 Stunden, 29 Minunten
Bei der Umsetzung in PHP wünsche ich dir viel Spaß -
Ich würde die Zeitangaben in der DB anders abspeichern:
Entweder du speicherst die Dauer in einer Spalte oder du benutzt zwei Spalten mit einer Anfangszeit und einer Endzeit (woraus du später die Differenz berechnen kannst). Im letzteren Fall würde ich dir empfehlen diese als DATETIME abzuspeichern.
Wenn du aber eine Spalte verweden möchtest, dann empfehle ich die Angaben in Sekunden oder Minuten abzuspeichern als INTEGER. Damit hast du dann die Möglichkeit mit diesen Werten zu rechnen.
-
Danke, hab das jetzt anders gelöst, dank deinem Tipp.
Ich hab jetzt einfach nochmal die Minuten "extrahiert", sodass ich dann einen fixen Minutenwert der Differenz der Zeit in der ich gegangen bin und 8 Stunden habe. Da muss ich mein Kopf einfach noch ein bisschen anstrengen, um die Minuten dann im Kopf in Stunden umzurechnen. Ich finde das geht so einfacher, als wenn ich im Kopf mit 1,333000 oder was weiß ich rechnen muss. :P
Obwohl ich dass vielleich dann noch als Orientierungswert dazu ausgeben könnte.
Egal, ich hab das Script jetzt fertig dank euch, danke! :) -
Hallo
habe auch bischen damit rum gespielt, hier mein Ergebnis:
<?php // ------------------------------------------ $stunden_daten = array ( '0:15', // --- Gesamt: 0:15 '0:45', // --- Gesamt: 1:00 '2:15', // --- Gesamt: 3:15 '-0:30', // --- Gesamt: 2:45 '1:15', // --- Gesamt: 4:00 '-1:00', // --- Gesamt: 3:00 '-0:45', // --- Gesamt: 2:15 '-2:30', // --- Gesamt: -0:15 ); // ------------------------------------------ echo "<br />\n"; echo "<br />\n"; $gesamt_dez = 0; foreach ($stunden_daten as $std_item) { if( strpos($std_item, '-') === FALSE ) { $zdir = 'plus'; } else { $zdir = 'minus'; } // --- Test 1 --- Berechnung Sekunden ---- $seconds1 = strtotime('1970-01-01 '.str_replace('-','',$std_item).':00 GMT'); $std_parts = explode(':',$std_item); $std_dez = ( abs($std_parts[0]) + ($std_parts[1] / 60) ); // --- Test 2 --- Berechnung Sekunden ---- $seconds2 = ( ($std_dez * 3600) ); // --- Test 3 --- Berechnung Sekunden ---- $seconds3 = ( ($std_parts[0] * 3600) + ($std_parts[1] * 60) ); $erg_std1 = ($seconds1 / 3600); if ($zdir == 'minus') { $erg_std1 = ($erg_std1 * -1); } $gesamt_dez = ($gesamt_dez + $erg_std1); // --- Dezimal --- $gesamt_std = floor(abs($gesamt_dez)); $gesamt_tmp = ( ($gesamt_dez - $gesamt_std) * 100 ); $gesamt_min = abs( ($gesamt_tmp * 60) / 100 ); $gesamtzeit = $gesamt_std.':'.$gesamt_min; // --- Wenn negativ dann Minus-Zeichen davor if ($gesamt_dez < 0) { $gesamtzeit = '-'.$gesamtzeit; } echo "<br />--------------------------------\n"; echo "<br />Datenzeile: ".$std_item."\n"; echo "<br />Z. Dezimal: ".$std_dez."\n"; echo "<br />Vorzeichen: ".$zdir."\n"; echo "<br />Seconds. 1: ".$seconds1."\n"; echo "<br />Seconds. 2: ".$seconds2."\n"; // --- Test 2 --- Berechnung Sekunden ---- echo "<br />Seconds. 3: ".$seconds2."\n"; // --- Test 3 --- Berechnung Sekunden ---- echo "<br />Stunden. A: ".$erg_std1."\n"; echo "<br />MinutenTMP: ".$gesamt_tmp."\n"; echo "<br />Zwischensumme Dezimal: ".$gesamt_dez."\n"; echo "<br />Zwischensumme Stunden: ".$gesamtzeit."\n"; echo "<br />\n"; echo "<br />\n"; } echo "<br />\n"; echo "<br />\n"; echo "<br />Gesamt Dezimal: ".$gesamt_dez."\n"; echo "<br />Gesamt Stunden: ".$gesamtzeit."\n"; echo "<br />\n"; echo "<br />\n"; // ------------------------------------------ ?>
mit verschiedenen "Wegen" um die Zeit in Sekunden umzurechnen,
da kann man sich eine (!) aussuchen, und die anderen weglassen :=)
Ausgabe mit allen Tests und Debug-Infos ist:
-------------------------------- Datenzeile: 0:15 Z. Dezimal: 0.25 Vorzeichen: plus Seconds. 1: 900 Seconds. 2: 900 Seconds. 3: 900 Stunden. A: 0.25 MinutenTMP: 25 Zwischensumme Dezimal: 0.25 Zwischensumme Stunden: 0:15 -------------------------------- Datenzeile: 0:45 Z. Dezimal: 0.75 Vorzeichen: plus Seconds. 1: 2700 Seconds. 2: 2700 Seconds. 3: 2700 Stunden. A: 0.75 MinutenTMP: 0 Zwischensumme Dezimal: 1 Zwischensumme Stunden: 1:0 -------------------------------- Datenzeile: 2:15 Z. Dezimal: 2.25 Vorzeichen: plus Seconds. 1: 8100 Seconds. 2: 8100 Seconds. 3: 8100 Stunden. A: 2.25 MinutenTMP: 25 Zwischensumme Dezimal: 3.25 Zwischensumme Stunden: 3:15 -------------------------------- Datenzeile: -0:30 Z. Dezimal: 0.5 Vorzeichen: minus Seconds. 1: 1800 Seconds. 2: 1800 Seconds. 3: 1800 Stunden. A: -0.5 MinutenTMP: 75 Zwischensumme Dezimal: 2.75 Zwischensumme Stunden: 2:45 -------------------------------- Datenzeile: 1:15 Z. Dezimal: 1.25 Vorzeichen: plus Seconds. 1: 4500 Seconds. 2: 4500 Seconds. 3: 4500 Stunden. A: 1.25 MinutenTMP: 0 Zwischensumme Dezimal: 4 Zwischensumme Stunden: 4:0 -------------------------------- Datenzeile: -1:00 Z. Dezimal: 1 Vorzeichen: minus Seconds. 1: 3600 Seconds. 2: 3600 Seconds. 3: 3600 Stunden. A: -1 MinutenTMP: 0 Zwischensumme Dezimal: 3 Zwischensumme Stunden: 3:0 -------------------------------- Datenzeile: -0:45 Z. Dezimal: 0.75 Vorzeichen: minus Seconds. 1: 2700 Seconds. 2: 2700 Seconds. 3: 2700 Stunden. A: -0.75 MinutenTMP: 25 Zwischensumme Dezimal: 2.25 Zwischensumme Stunden: 2:15 -------------------------------- Datenzeile: -2:30 Z. Dezimal: 2.5 Vorzeichen: minus Seconds. 1: 9000 Seconds. 2: 9000 Seconds. 3: 9000 Stunden. A: -2.5 MinutenTMP: -25 Zwischensumme Dezimal: -0.25 Zwischensumme Stunden: -0:15 Gesamt Dezimal: -0.25 Gesamt Stunden: -0:15
.. also es scheint zu funktionieren ...
und nicht vergessen, ... nicht 1 zu 1 übernehmen, es genügt eine Variante der Sekunden-Brechnung
... den Test 2 und Test 3 kann man weg-lassen ... wollte nur verschiedene "Rechen-Wege" testen
:)
Beitrag zuletzt geändert: 8.11.2012 21:02:37 von wmag -
pasi-b schrieb:
Danke, hab das jetzt anders gelöst, dank deinem Tipp.
Freut mich, dass ich helfen konnte. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage