Sekunden in "hh:mm:ss" umwandeln

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


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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren