www.mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Danke

Christian

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welcher Sprache?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


:-)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@philipp

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

Autor: biene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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?
uint32_t s = DeineAnzahlSekunden
uint32_t m;
uint32_t h;

h = s / 3600;
s -= 3600 * h;
m = s / 60;
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.

Autor: DerSchelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!).

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DerSchelm wrote:
> Ihr habt es schon gesagt: Divisionen sind richtig teuer.

Versuch es mal mit dem guten alten Modulus!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Philipp Burch (philipp_burch)
Datum:

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

Aber Zeit.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned long sek_rein = 7210;
unsigned char std = 0;
unsigned char minuten = 0;
unsigned char sekunden = 0;
int i;

for (i=0; i<17; i++) {
  std <<= 1;
  minuten <<= 1;
  sekunden <<= 1;
  sek_rein <<= 1;
  if (sek_rein & (1 << 17))
    sekunden++;
    if (sekunden >= 60) { sekunden -= 60; minuten++; }
    if (minuten >= 60) { minuten -= 60; std++; }

  }
}

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ha Jo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bobby (Gast)
Datum:

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

Autor: Ha Jo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

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

Gruß

Frank

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Frank

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

Autor: Christian Berger (casandro) Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ha Jo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.