Sekunden in "hh:mm:ss" umwandeln

Gast #722935
@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


:-)
Gast #722943
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);
#722984
@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.
Gast #722998
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!).
Gast #723015
>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.
Gast #723213
>> 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.
Gast #723250
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
}
Gast #723260
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
Gast #723275
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
Gast #723350
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
#723632
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
Gast #723634
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.