Hallo, ich suche eine elegante Methode um Sekunden in das Format hh:mm:ss umzuwandeln. Je effektiver umso besser. Danke Christian
@Christian: Versuchs doch mal mit der Standardlösung :-) variable Sekunde_rein; variable Sekunde_raus; variable Stunde; variable Minute; variable Elefant; Elefant = Sekunde_rein; Stunden= Elefant/ (24*60); Elefant = Elefant -(Stunden*24*60); Minuten = Elefant / 60; Elefant = Elefant - Minuten*60; Sekunden_raus = was halt übrig bleibt... = Elefant :-)
Ich hab das in C bisher immer so gemacht. Keine Anhnung ob das jetzt sehr effektiv ist. int time_s; ldiv_t res; int Sekunden, Minuten, Stunden; res = ldiv( time_s, 60 ); Sekunden = res.rem; res = ldiv( res.quot, 60 ); Minuten = res.rem; Stunden = res.quot; printf("Time: %02d:%02d:%02d", Stunden, Minuten, Sekunden);
@Stefan: Na dann, soll er halt die Methode bekommen. Verwende die vorgefertigte Funktion zum Formatieren einer Zeit ;) Ist bestimmt die eleganteste Lösung und existiert fast in allen Sprachen in irgendeiner Form. Ausserdem: Hat eine Stunde nicht eher 60*60 Sekunden?
1 | uint32_t s = DeineAnzahlSekunden |
2 | uint32_t m; |
3 | uint32_t h; |
4 | |
5 | h = s / 3600; |
6 | s -= 3600 * h; |
7 | m = s / 60; |
8 | s -= 60 * m; |
Das wäre so das allgemeine Vorgehen. Die vielen Divisionen sind aber nicht unbedingt so effizient, je nachdem wie optimiert wird ist die Variante von biene besser.
Ihr habt es schon gesagt: Divisionen sind richtig teuer. Wie wäre es, die Uhrzeit direkt in Stunden, Minuten, Sekunden abzulegen, dann jeweils die Sekunden zu inkrementieren und mit den entsprechenden Überträgen zu arbeiten. Spart Divisionen ohne Ende und kostet quasi nichts. Übersichtlich ist es allemal. also z.B. if (++sec>=60) { sec=0; if (++min>=60) ... usw } tut auch fürs Datum, mit entsprechenden Anpassungen (Schaltjahre!).
>Ausserdem: Hat eine Stunde nicht eher 60*60 Sekunden?
Ups, mein Fehler :-) Faktor 60 habe ich mir oben konsequent weggespart.
Sorry, war nur schnell am frühen Sonntagmorgen zusammengetippt (11:07).
Die Methode ist aber denke ich trotzdem ersichtlich.
DerSchelm wrote:
> Ihr habt es schon gesagt: Divisionen sind richtig teuer.
Versuch es mal mit dem guten alten Modulus!
>> Ihr habt es schon gesagt: Divisionen sind richtig teuer. > > Versuch es mal mit dem guten alten Modulus! Der ist genauso teuer, da er mit der selben Methode berechnet wird.
Also die Operation kostet nicht viel Speicher, wenn man nur mit integers rechnet.
Michael G. wrote: > Also die Operation kostet nicht viel Speicher, wenn man nur mit integers > rechnet. Aber Zeit.
1 | unsigned long sek_rein = 7210; |
2 | unsigned char std = 0; |
3 | unsigned char minuten = 0; |
4 | unsigned char sekunden = 0; |
5 | int i; |
6 | |
7 | for (i=0; i<17; i++) { |
8 | std <<= 1; |
9 | minuten <<= 1; |
10 | sekunden <<= 1; |
11 | sek_rein <<= 1; |
12 | if (sek_rein & (1 << 17)) |
13 | sekunden++; |
14 | if (sekunden >= 60) { sekunden -= 60; minuten++; } |
15 | if (minuten >= 60) { minuten -= 60; std++; } |
16 | |
17 | }
|
18 | }
|
Man kann's auch uebertreiben, nen bissel lesbar darf der Code schon auch noch sein. Ausserdem: Wie oft machst Du denn eine solche Operation, dich maximal einmal in der Sekunde...
Es ging doch darum, den Zeitbedarf der Dimensionen zu vermeiden ;-) Außerdem kann man das ja in eine entsprechend sinnvoll benannte Funktion kapseln. Der restliche Code bleibt dann sehr lesbar, und die Funktion läßt sich ja schön einzeln testen, wenn man ihr nicht traut. Muß man ja nicht so machen, wollt nur mal aufzeigen, wie mans machen kann
Die Methode, direkt in Sekunde/Minute/Stunde zu arbeiten ist nur solange gut, wie man keine weitere Zeitrechnung benötigt. Wenn man Vergleiche oder Subtraktionen und Additionen braucht, ist es wesentlich bequemer, nur in Sekunden zu rechnen und bei Bedarf dann die in hh:mm:ss umzurechnen. Siehe die Routinen von Peter Dannegger: Beitrag "Berechnung Datum + Uhrzeit + Sommerzeit" Die Methode ist meiner Meinung nach das eleganteste. Sicher kostet Sie Rechenzeit. Hajo
Es hindert einen aber keiner daran, auch noch einen Sekundenzähler mitzuführen...
Bobby wrote: > Es hindert einen aber keiner daran, auch noch einen Sekundenzähler > mitzuführen... Natürlich nicht, aber: [X] Redundante Datenhaltung ist sehr unelegant. [X] Redundante Datenhaltung führt schnell zu Fehlern (z.B. Inkonsistenz). [X] Redundante Datenhaltung kostet auch Rechenzeit + Speicher. [X] In vernünftig strukturierten Programmen vermeidet man redundante Datenhaltung. Hajo
printf("%02d:%02d:%02d", sec/3600, (sec- 3600*(sec/3600))/60, sec%60); Gruß Frank
Danke Frank Aber Heute warst du wohl ein bisschen spät dran. Musste das nächste mal früher aufstehen...
Mach folgendes: (Pseudocode) Stunden:=0; Minuten:=0; WHILE Sekunden>=3600 DO BEGIN Sekunden:=Sekunden-3600; Stunden:=Stunden+1; END; WHILE Sekunden>=60 DO BEGIN Sekunden:=Sekunden-60; Minuten:=Minuten+1; END; Das mag zwar jetzt sehr ineffizient aussehen, braucht jedoch viel weniger Rechnenzeit als klassische Divisionen. Plus Du könntest da sogar die Unterstützung für das Datum reinbauen, und dann mit Unixzeit arbeiten. [1] Mit etwas Überlegen kannst Du sogar einen Algorithmus für Schaltjahre machen. Eventuell sogar für Sommer und Winterzeit. [1] http://de.wikipedia.org/wiki/Unixzeit
Christian Berger wrote: ---snip > > Plus Du könntest da sogar die Unterstützung für das Datum reinbauen, und > dann mit Unixzeit arbeiten. [1] Mit etwas Überlegen kannst Du sogar > einen Algorithmus für Schaltjahre machen. Eventuell sogar für Sommer und > Winterzeit. > > [1] http://de.wikipedia.org/wiki/Unixzeit ---snap Siehe wie schon mal weiter oben genannt: Beitrag "Berechnung Datum + Uhrzeit + Sommerzeit" Dort wird auch das Datum mit Schaltjahr aus den Sekunden berechnet. Hajo
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.