kostenloser Webspace werbefrei: lima-city


PHP Minusstunden und normale Stunden summieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    pasi-b

    Kostenloser Webspace von pasi-b

    pasi-b hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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ß :thumb:
  4. 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.
  5. Autor dieses Themas

    pasi-b

    Kostenloser Webspace von pasi-b

    pasi-b hat kostenlosen Webspace.

    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! :)
  6. 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 ... :wink:

    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
  7. pasi-b schrieb:
    Danke, hab das jetzt anders gelöst, dank deinem Tipp.

    Freut mich, dass ich helfen konnte.
  8. 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!