Sekunden in Minuten:Sekunden umrechnen
Andreas
- programmiertechnik
Hallo!
* ja - bin immer noch wach... *
Also ich hab das wieder ein neues Problem: Ich habe ein Eine best. Anzahl an Sekunden, und ich möchte die Sekunden jetzt in Minuten:Sekunden ausdrücken, also z.B. 155 Sekunnden, daraus soll werden
2:35 => 2 Minuten und 35 Sekunden
Mir fällt aber so überhaupt gar keine Möglichkeit ein, wie ich das "umrechnen" könnte. Und die mir bekannten PHP-Funktionen beziehen sich immer auf ein Kalenderdatum, oder?
Jemand ne Idee?
Viel grüße,
Andreas
Hab mal was probiert:
<?
$min=0;
for($sec = 320;$sec >= 60;$sec - 60) {
$min++;
}
echo $min.":".$sec;
?>
Aber das gibt wohl eine Endlosschlefe - wieso?
Grüße
Andreas
for($sec = 320;$sec >= 60;$sec - 60) {
Aber das gibt wohl eine Endlosschlefe - wieso?
Richtig:
for ($sec = 320; $sec >= 60; $sec -= 60) {
(oder $sec = $sec-60)
Hallo!
* ja - bin immer noch wach... *
Also ich hab das wieder ein neues Problem: Ich habe ein Eine best. Anzahl an Sekunden, und ich möchte die Sekunden jetzt in Minuten:Sekunden ausdrücken, also z.B. 155 Sekunnden, daraus soll werden
2:35 => 2 Minuten und 35 Sekunden
Mir fällt aber so überhaupt gar keine Möglichkeit ein, wie ich das "umrechnen" könnte. Und die mir bekannten PHP-Funktionen beziehen sich immer auf ein Kalenderdatum, oder?
Jemand ne Idee?
Viel grüße,
Andreas
$sek = 155;
$min = $sek / 60; // = 2.5833333 Das hast du vor dem Komma schon die Minuten
$min_final = round($min);
$rest = explode(".",$min); // $rest[1] = 58333
$rest = $rest[1] / 10; // $rest = 58.333
$rest = round($rest); // $rest = 58
$sek_final = ($rest * 60) / 100; // Nach dreisatz
echo "$min_final:$sek_final";
Das sieht jetzt ziemlich kompliziert aus, und wahrscheinlich gibt es eine vieieieieieiel bessere Lösung, aber ich gehe gerade ins Bett und stehe nciht auf ;-)
Hi!
$sek = 155;
$min = $sek / 60; // = 2.5833333 Das hast du vor dem Komma schon die Minuten
$min_final = round($min);
$rest = explode(".",$min); // $rest[1] = 58333
$rest = $rest[1] / 10; // $rest = 58.333
$rest = round($rest); // $rest = 58
$sek_final = ($rest * 60) / 100; // Nach dreisatz
echo "$min_final:$sek_final";
Das sieht jetzt ziemlich kompliziert aus, und wahrscheinlich gibt es eine vieieieieieiel bessere Lösung, aber ich gehe gerade ins Bett und stehe nciht auf ;-)
Ja, die gibt es ;-)
$sek = 155;
$min = floor($sek/60);
$sek_rest = $sek-$min*60;
*SCNR*
VG->Cologne
Simon
Hallo Andreas
Also ich hab das wieder ein neues Problem: Ich habe ein Eine best. Anzahl an Sekunden, und ich möchte die Sekunden jetzt in Minuten:Sekunden ausdrücken, also z.B. 155 Sekunnden, daraus soll werden
2:35 => 2 Minuten und 35 Sekunden
<?php
$s=155;
$k=sprintf("%s:%02s",floor($s/60),$s%60);
echo $k;
?>
Diese Zeile bewirkt:
$s/60 ==> 2.58333333333332
dividiere den Wert durch 60 (Anzahl der Sekunden je Minute)
Die Zahl vor dem Komma entspricht der Minutenzahl. Die erhälst du mit:
floor($s/60) ==> 2
floor rundet den Wert ab.
$s % 60 bestimmt den Rest der Division durch 60 ==> 35
sprintf bewirkt die Kosmetik und gibt dir den String formatiert zurück.
"%s:%02s" bedeutet: nehme den ersten Wert unverändert schreibe dann einen Doppelpunkt und füge anschließend die Restsekunden gegebenenfalls mit einer führenden Null an.
Viele Grüße
Antje
Hallo, Anne!
2:35 => 2 Minuten und 35 Sekunden
<?php
$s=155;
$k=sprintf("%s:%02s",floor($s/60),$s%60);
echo $k;
?>
Eine wirklich elegante Lösung. Allerdings mit einem kleinen Schönheitsfehler:
Die Funktion "floor" rechnet wie gewohnt bei positiven Zahlen, aber bei negativen Zahlen (die ja durchaus auftreten könnten) wird sie "falsch" rechnen:
floor(1.6) = 1
floor(-1.6) = -2
Aber warum überhaupt mit floor rumärgern, wenn sprintf die Nachkommastellen einfach abschneiden kann?
Damit keine zwei negativen Vorzeichen sichtbar werden, wird die Sekundenzahl mit abs() dann noch positiv gemacht, und fertig. :)
$k = sprintf("%d:%02s",$s/60,abs($s%60));
- Sven Rautenberg
Hallo!
Einen Gedanken in diese Richtung habe ich erst gar nicht weiterverfolgt, da ich gedacht habe, wenn dabi gerundet wird, KANN doch gar nicht die richtige Zeit rauskommen!
Bei meiner Schleifenvariante ist es 100%ig!
Die Schleifenversion dürfte aber rechenintensiver sein, aber ich glaub nicht, das man das merkt, oder?
Viele grüße
Andreas
Hallo!
Einen Gedanken in diese Richtung habe ich erst gar nicht weiterverfolgt, da ich gedacht habe, wenn dabi gerundet wird, KANN doch gar nicht die richtige Zeit rauskommen!
Tja, stimmt aber nicht. Wenn du _ganzzahlige_ Sekunden hast, dann kann man mit ganzzahligen Divisionsoperationen auch absolut korrekt Sekunden umrechnen in Minuten:Sekunden.
Grundlage ist folgende Gleichung:
Sekunden = Minuten*60+Sekundenrest
Logisch: Die Zahl der Minuten ist Sekunden/60. Da das eine Nachkommazahl ist, ist sie nicht sehr handlich. Aber die Zahl vor dem Komma gibt die Zahl der vollständigen Minuten an, die in der Sekundenanzahl steckt. Und diese Zahl ist immer korrekt.
Was die Zahl der Sekunden angeht: Die Modulo-Operation rechnet den "Rest" aus, der bei einer ganzzahligen Division übrigbleibt. Das sind genau die Sekunden, die bei der Fließkommadivision im Kommaanteil stecken.
Als Beispiel:
23 / 5 = x Rest y
Grundschulwissen wieder hervorholen:
Die 5 paßt in die 23 genau 4mal herein. Also 23 / 5 = 4 Rest y.
Da 5 * 4 = 20, bleibt ein Rest von 3, weil 23 - 20 = 3.
Folglich: 23 / 5 = 4 Rest 3.
23 MODULO 5 = 3 (eben dieser Rest).
Dieser Rest würde sich umwandeln in eine Nachkommastelle:
3 / 5 = 0,6 - folglich ist 23 / 5 = 4,6.
Bei den Sekunden klappt es genauso:
155 / 60 = 2 Rest 35 -> 2:35 Minuten.
Bei meiner Schleifenvariante ist es 100%ig!
Deine Schleife arbeitet genauso:
Ziehe solange 60 von der Sekundenzahl ab, wie die Sekundenzahl größer als 59 ist, und erhöhe dafür den Minutenzähler -> Sekunden / 60.
Was als Sekundenzahl kleiner 60 übrigbleibt, sind die Restsekunden -> Sekunden MODULO 60.
Die Schleifenversion dürfte aber rechenintensiver sein, aber ich glaub nicht, das man das merkt, oder?
Deine Version dauert länger, ist schwerer zu verstehen, hat längeren Programmtext und macht "nur" genau das gleiche, wie die Einzeilen-Kurzversion. Warum nicht effektiv programmieren und die Einzeilenkurzversion nehmen? :)
- Sven Rautenberg
Hallo Sven,
prima erklärt :-)
Deine Version dauert länger, ist schwerer zu verstehen, hat längeren Programmtext und macht "nur" genau das gleiche, wie die Einzeilen-Kurzversion. Warum nicht effektiv programmieren und die Einzeilenkurzversion nehmen? :)
zudem läßt sich die Einzelversion wesentlich schneller erweitern. Ein bissel nachdenken und sofort hat man die Sekunden in Stunden bzw. Tage umgerechnet und formatiert ausgegeben
z.B.
$s=7401*24;
echo sprintf("%d Tage %02d:%02d:%02s",$s/24/60/60,$s/60/60%24,$s/60%60,$s%60);
auf abs() habe ich jetzt mal aus Übersichtsgründen verzichtet.
Viele Grüße
Antje
Hoi Antje,
Kleiner Fehler:
$s=7401*24;
echo sprintf("%d Tage %02d:%02d:%02s",$s/24/60/60,$s/60/60%24,$s/60%60,$s%60);
Warum %2s? 's' steht fuer 'string', das ist hier aber nicht
gefordert ;-) Also:
echo sprintf("%d Tage %02d:%02d:%02d",$s/24/60/60,$s/60/60%24,$s/60%60,$s%60);
Gruesse,
c.j.k
Hi Antje,
echo sprintf("%d Tage %02d:%02d:%02s",$s/24/60/60,$s/60/60%24,$s/60%60,$s%60);
jaja, heutzutage kostet das alles ja nichts mehr ... wenn ich daran zurück denke, daß ich mal gelernt habe, wie viele Takte teurer Punkt- gegenüber Strichrechnung ist und wie effizient es ist, Zwischenergebnisse weiter zu verwenden ... so ändern sich die Zeiten ...
Sich alt fühlend,
Michael
Hallo Michael,
wenn ich daran zurück denke, daß ich mal gelernt habe, wie viele
Takte teurer Punkt- gegenüber Strichrechnung ist
Das lernt man auch heute noch ;-) Zumindest als Fach-Informatiker.
und wie effizient es ist, Zwischenergebnisse weiter zu verwenden
Auch das lernt man noch.
Sich alt fühlend,
Ach was!
Gruesse,
c.j.k