Berechnung von Sekunden in Stunden und Minuten

brainsucker

Erfahrenes Mitglied
Hi,

ich habe mir eine kleine Funktion gebastelt die Sekunden in Minuten und Stunden umrechnen und ausgeben soll. Wichtig dabei ist, dass wenn eine Minute angebrochen wird (d.h. die verbleibenden Sekunden > 0 sind) diese als volle Minute gezählt werden soll.

Ich denke ich habe eine Lösung gefunden, bin mir jedoch nicht sicher ob diese korrekt und gegen alle Eventualitäten gewappnet ist. Daher würde ich euch die Funktion gerne hier zeigen und bitten mal drüber zu schauen. Falls jemanden etwas auffällt oder einen Fehler entdeckt, bitte posten.


Falls alles ok sein sollte, würde ich die Funktion auch in den Code Schnipsel Bereich zur Verfügung stellen...

Hier nun die Funktion:

PHP:
// start und ende sind Timestamps aus der Datenbank
$start = 	1216541758;
$ende = 	1216570520;
// Berechne die Zeitspanne zwischen start und ende in sekunden...
$differenz = $ende-$start;


function secToAll($sekunden) // der Funktion wird die Zeit in Sekunden übergeben
	{
	// Berechne wieviele volle stunden sich aus den übergebenen Sekunden ergeben
	$stunden_grob = $sekunden / 3600;
	$stunden_extract = explode('.',$stunden_grob); // Hier werden nun die vollen Stunden extrahiert
	$stunden = $stunden_extract[0]; // Hier stehen nun die vollen Stunden
	
	$restliche_minuten = $sekunden%3600; // Ermittle nun die verbleibenden Minuten

	
	$minuten_grob = $restliche_minuten /60; 
	$minuten_extract = explode('.',$minuten_grob); // Hier werdenn un die vollen Minuten extrahiert
	$minuten = $minuten_extract[0]; // Hier stehen nun die vollen Minuten
	
	$restliche_sekunden = $restliche_minuten % 60; // Berechne die verbleibenden Sekunden
	
	if($restliche_sekunden>0) // Wenn eine neue Minute angebrochen wurde soll diese als Ganze zählen
		{
		$minuten++; // Anzahl Minuten wird erhöht
			if($minuten == 60) {$minuten = 0; $stunden++;} // Prüfe nun ob die Anzahl der Minuten = 60 ist (Dies wäre eine volle Stunde) Daher wird Minuten auf 0 gesetzt und Stunden um 1 erhöht
		}
	
	
	echo "Stunden: " . $stunden . " Minuten: " . $minuten;
	}

secToAll($differenz); // Aufruf der Funktion
 
Das kannst du eigentlich recht gut selbst testen, indem du Testfälle aufstellst. Also mögliche Eingabewerte und erwartete Ausgabewerte. Beispielsweise:
Code:
+-------------+------------------+
| Eingabewert | erw. Ausgabewert |
+-------------+------------------+
|           0 |              0:0 |
|           1 |              0:1 |
|          59 |              0:1 |
|          60 |              0:2 |
|          61 |              0:2 |
|        3599 |             0:59 |
|        3600 |              1:0 |
|           … |                … |
+-------------+------------------+
 
Das kannst du eigentlich recht gut selbst testen, indem du Testfälle aufstellst. Also mögliche Eingabewerte und erwartete Ausgabewerte. Beispielsweise:
Code:
+-------------+------------------+
| Eingabewert | erw. Ausgabewert |
+-------------+------------------+
|           0 |              0:0 |
|           1 |              0:1 |
|          59 |              0:1 |
|          60 |              0:2 |
|          61 |              0:2 |
|        3599 |             0:59 |
|        3600 |              1:0 |
|           … |                … |
+-------------+------------------+


Habe es mal durchlaufen lassen, folgende Abweichungen habe ich festgestellt:

Code:
+-------------+------------------+
| Eingabewert | erw. Ausgabewert |
+-------------+------------------+
|           0 |              0:0 |
|           1 |              0:1 |
|          59 |              0:1 |
|          60 |              0:1 |
|          61 |              0:2 |
|        3599 |             1:0 |
|        3600 |              1:0 |
|           … |                … |
+-------------+------------------+

D.h. meine Funktion würde nicht ordnungsgemäß arbeiten?

Falls jemand eine besser Lsg oder Verbesserungen hat, bin ganz Ohr :)
 
So wie ich das sehe ist das vollkommen richtig.
Du möchtest jede angebrochene Minute als eine Volle zählen, genau das wird getan.
Wäre bei einem Eingabewert von "60" das Ergebniss "0:2", würden zwei Minuten gezählt werden, was definitiv falsch wäre.

Oder habe ich Tomaten auf den Augen?
 
Im Grunde schon.
Ist die Frage, ob die Funktion auch 0 Minuten als Ergebniss zurück geben darf oder nicht. :)
 
Ich habe mal etwas ähnliches gebraucht um das Alter von Personen zu berechnen und dabei folgendes gefunden:

PHP:
function intervall($sek) {
    $i = sprintf('%d Jahr%s, %d Tag%s, %d Stunde%s',
            // Jahre
            $sek / 31536000,
            floor($sek / 31536000) != 1 ? 'e':'',
			
            // Tage
            $sek / 86400 % 365,
            floor($sek / 86400 % 365) != 1 ? 'e':'',
            
            // Stunden
            $sek / 3600 % 24,
            floor($sek / 3600 % 24) != 1 ? 'n':''
         );
    return $i;
}

Finde ich sehr geil die Lösung (Nicht ganz genau wegen Schaltjahren etc.) ;)
Das müsste mal doch auf jeden Fall auch für Minuten und Sekunden umschreiben können ^^

lg
 
Hier so würds denke ich klappen ;)

PHP:
$times = array(0, 1, 10, 59, 60, 250, 300, 900, 3600, 12342, 542842);

function seksplit($sek) {
	
	$i = sprintf('%d Stunde%s %d Minute%s %d Sekunde%s',
		// Stunden
		$sek / 3600,
		floor($sek / 3600) != 1 ? 'n' : '',
		
		// Minuten
		$sek / 60 % 60,
		floor($sek / 60 % 60) != 1 ? 'n' : '',
		
		// Sekunden
		$sek % 60,
		floor($sek % 60) != 1 ? 'n' : ''
	);
	
	return $i;
}

foreach ($times as $time) {
	echo $time.' = '.seksplit($time).'<br>';
}

gibt:
0 = 0 Stunden 0 Minuten 0 Sekunden
1 = 0 Stunden 0 Minuten 1 Sekunde
10 = 0 Stunden 0 Minuten 10 Sekunden
59 = 0 Stunden 0 Minuten 59 Sekunden
60 = 0 Stunden 1 Minute 0 Sekunden
250 = 0 Stunden 4 Minuten 10 Sekunden
300 = 0 Stunden 5 Minuten 0 Sekunden
900 = 0 Stunden 15 Minuten 0 Sekunden
3600 = 1 Stunde 0 Minuten 0 Sekunden
12342 = 3 Stunden 25 Minuten 42 Sekunden
542842 = 150 Stunden 47 Minuten 22 Sekunden

so geht es auch.

EDIT:
Nur die sache mit der verbleibenden Sekunde hab ich vergessen - hier die Lösung:
PHP:
function seksplit($sek) {
	
	$i = sprintf('%d Stunde%s %d Minute%s',
		// Stunden
		$sek / 3600,
		floor($sek / 3600) != 1 ? 'n' : '',
		
		// Minuten
		($sek / 60 % 60) + (floor($sek % 60) ? 1 : 0),
		floor(($sek / 60 % 60) + (floor($sek % 60) ? 1 : 0)) != 1 ? 'n' : ''
	);
	
	return $i;
}
Ein wenig kürzer :D

Ausgabe für die selben Werte wie oben:
0 = 0 Stunden 0 Minuten
1 = 0 Stunden 1 Minute
10 = 0 Stunden 1 Minute
59 = 0 Stunden 1 Minute
60 = 0 Stunden 1 Minute
250 = 0 Stunden 5 Minuten
300 = 0 Stunden 5 Minuten
900 = 0 Stunden 15 Minuten
3600 = 1 Stunde 0 Minuten
12342 = 3 Stunden 26 Minuten
542842 = 150 Stunden 48 Minuten

EDIT Part2:
Hatte noch nen dicken Fehler drin ;) Aber nun ist alles behoben!
Es sei denn einem von euch fällt noch was auf?!


lg
 
Zuletzt bearbeitet:
Genial wäre es jetzt den ganzen Spies umzudrehen. Also wenn man "01:00" eingibt dass er die Sekunden anzeigt :)


<< Fat-Z >>
 
Zurück