Forum: Mikrocontroller und Digitale Elektronik Sekunden in "hh:mm:ss" umwandeln


von Christian (Gast)


Lesenswert?

Hallo,

ich suche eine elegante Methode um Sekunden in das Format hh:mm:ss 
umzuwandeln. Je effektiver umso besser.

Danke

Christian

von Philipp B. (philipp_burch)


Lesenswert?

In welcher Sprache?

von Stefan (Gast)


Lesenswert?

@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


:-)

von Stefan (Gast)


Lesenswert?

@philipp

Er sucht ja nur eine Methode, kein Programm :-)

von biene (Gast)


Lesenswert?

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);

von Philipp B. (philipp_burch)


Lesenswert?

@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.

von DerSchelm (Gast)


Lesenswert?

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!).

von Stefan (Gast)


Lesenswert?

>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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

DerSchelm wrote:
> Ihr habt es schon gesagt: Divisionen sind richtig teuer.

Versuch es mal mit dem guten alten Modulus!

von Rolf Magnus (Gast)


Lesenswert?

>> 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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Also die Operation kostet nicht viel Speicher, wenn man nur mit integers 
rechnet.

von Philipp B. (philipp_burch)


Lesenswert?

Michael G. wrote:
> Also die Operation kostet nicht viel Speicher, wenn man nur mit integers
> rechnet.

Aber Zeit.

von der mechatroniker (Gast)


Lesenswert?

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
}

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

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...

von der mechatroniker (Gast)


Lesenswert?

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

von Ha Jo (Gast)


Lesenswert?

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

von Bobby (Gast)


Lesenswert?

Es hindert einen aber keiner daran, auch noch einen Sekundenzähler 
mitzuführen...

von Ha Jo (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

printf("%02d:%02d:%02d", sec/3600, (sec- 3600*(sec/3600))/60, sec%60);

Gruß

Frank

von Stephan (Gast)


Lesenswert?

Danke Frank

Aber Heute warst du wohl ein bisschen spät dran.
Musste das nächste mal früher aufstehen...

von Christian B. (casandro)


Lesenswert?

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

von Ha Jo (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.