C# Gegebene Zeit in s ausgeben in Tagen, h, min, s

Voltago

Commander
Registriert
Nov. 2010
Beiträge
2.228
Hallo,

ich programmiere seit kurzem kleinere, einfache Programme mit C#. Ich hab allerdings jetzt ein Beispiel von meinem Lehrer bekommen, bei dem ich nicht mehr weiterkomme.

Die Aufgabenstellung ist folgende: Eine Zeit (gegeben in Sekunden) soll in Tagen, Stunden, Minuten und Sekunden ausgegeben werden.

Bei den Stunden bekomme ich das noch hin, allerdings komme ich auf keine Lösung, in der die Tage auch eingebunden sind.

Mein Ansatz sieht so aus: (zeit ist 1 Tag, 1h, 1min, 1s)

Code:
int zeit = 90061, tage, stunden, minuten, sekunden, rest;


rest = zeit % 3600;
minuten = rest / 60;
sekunden = rest % 60;
stunden = zeit / 3600;

label_ausgabe.Text= stunden + " Stunde(n) " + minuten + " Minute(n) " + sekunden + " Sekunde(n)";
abel_ausgabe.Visible = true;

Dadurch erscheint im Label dann die Ausgabe "25 Stunden 1 Stunde(n) 1 Minute(n) 1 Sekunde(n)".

Die Frage ist jetzt, wie ich die Tage da reinbekomme. Ich habe schon so viel durchprobiert, meine Lösungen sind daran gescheitert, dass der Speicher, den ich zum Berechnen eines anderen gebraucht hätte, erst später definiert wurde und es deshalb Fehler gab.

Bestimmt ist die Lösung einfach und mein ganzes Zeug ist viel zu kompliziert.

Bin dankbar für jede Hilfe.

Gruß,
Voltago
 
Überleg doch mal wieviele Sekunden ein Tag hat? ;)
Da bekommst du ganz schnell die Lösung, den Rest hast du ja auch hinbekommen.
 
uh....

So wie die anderen Zeitangaben auch berechnet werden. Irgendwie verstehe ich dein Problem gerade nicht so recht.
 
Schauen ob die Stunden größer gleich 24 sind, wenn ja wird solange 24 von den Stunden abgezogen bis der Rest kleiner ist wie 24. Keine Ahnung wie die Syntax in C# ist aber orientier dich einfach mal an meinem "Javapseudocode".

Code:
if(stunden>=24)
{
[INDENT]int rest = 24;
int tage = 0;
while(rest>=24)
{
[INDENT]rest = stunden-24;
tage = tage +1;[/INDENT]
}[/INDENT]
}
else
{
[INDENT] int tage = 0;[/INDENT]
}

Sollte eigentlich gehen, falls nicht bitte ich um Korrektur (evtl sind die größer/kleiner Zeichen falsch herum, komm da selbst immer durcheinander^^

Edit: DaysShadows Variante geht natürlich auch :)
 
Zuletzt bearbeitet:
Die Lösung könnte zwar korrekt sein, ich würde allerdings empfehlen sowas ohne eine Schleife zu programmieren. Stichwort Laufzeit.

BTW: Habt ihr alle in Mathe gepennt? :D
 
Ich versteh auch deinen Lösungsweg garnicht. Warum ist rest bei dir direkt zeit % 3600 ?
Ich würde sowas immer geordnet angehen. Erst die Sekunden, dann die Minuten, dann die Stunden etc.


Code:
Hilfestellung ja, Lösung nein.
 
Zuletzt bearbeitet von einem Moderator:
Schmeißt ihm doch alle Lösungen in den Hals statt ihn selbst überlegen zu lassen :rolleyes:
 
Ich hab schon länger nichts mehr in Richtung Programmierung gemacht und mit dem Syntax von C# kenne ich mich auch nicht wirklich aus.

Ich würde es spontan so lösen:

Code:
int zeit = 90061, tage, stunden, minuten, sekunden, rest;


tage = zeit / 60 / 60 / 24; //oder einfach zeit / 86400
rest = zeit - (tage * 86400) //Restsekunden, was dann die stunden wären

stunden = rest / 60 / 60; //oder einfach rest / 3600
rest = rest - (stunden*3600) //Restsekunden, was dann die minuten wären

minuten = rest / 60;
rest = rest - (minuten*60) //Restsekunden, was dann die sekunden wären

sekunden = rest;

label_ausgabe.Text= tage + " Tag(e)" + stunden + " Stunde(n) " + minuten + " Minute(n) " + sekunden + " Sekunde(n)";

Wobei die Variablen keine Fließkommawerte darstellen darf (also vom Typ INT oder nen kleineren Datentyp), denn 1,1 Tage darf es ja dann nicht geben (ggf. irgendwie abrunden lassen).

Für mich sieht mein Weg irgendwie unelegant aus, aber somit sollte es klappen. Natürlich ohne Gewähr :D
 
Zuletzt bearbeitet:
Keine Lösungen, ist das so schwer zu verstehen?
Er hat nichts davon die Lösung vorgesetzt zu bekommen...

Noch 2 Posts vor dir wurde eine Lösung vom Admin entfernt.
 
Also wenn du ne super einfache und super kurze Lösung willst, solltest du die von Darlis nehmen. Schau dir einfach mal die verlinkte TimeSpan Klasse an. Die "Berechnung" ist da ein Einzeiler. Das Framework zu kennen gehört zu den Programmierskills :)
 
Zuletzt bearbeitet:
Darlis schrieb:

Danke für den Tipp, der Code sieht momentan so aus:

Code:
zeit = 90061; // in Sekunden

label.Text = "" + TimeSpan.FromSeconds(zeit);

Damit krieg ich die Zeit im oberen Beispiel als "1:01:01:01" im Label ausgegeben.

Ich hätte aber gerne die Ausgabe so, wie sie anfangs geplant war:

Code:
label.Text = <Tage> + " Tag(e) " + <Stunden> + " Stunde(n) " + <Minuten> + " Minute(n)" + <Sekunden> + " Sekunde(n)";

Wie bekomme ich die einzelnen Komponenten jetzt ausgelesen? Ich werde aus dem, was Microsoft da schreibt, nicht schlau. Ein Intervall hab ich ja keins, sondern die Zeit ist der Unterschied aus 2 Zeiten, die vom Benutzer eingegeben werden.

Die Option für "Days" usw. gibt es ja, nur bei TimeSpan.Days(zeit) bzw. TimeSpan.FromSeconds.Days(Zeit) gibt's nen schönen Fehler :D

Edit: Ok, ich hab die Lösung, das Days kommt ganz am Ende, sprich TimeSpan.FromSeconds(Zeit).Days.

Danke für die Hilfe, das funktioniert jetzt :)
 
Zuletzt bearbeitet:
Das FromSeconds gibt eine TimeSpan Instanz zurück. Die kannst du dir auch speichern und dann
die verschiedenen Längen mit .Days .Minutes .Hours usw. abrufen.

Also:
TimeSpan t = TimeSpan.FromSeconds(seconds);

t.Minutes
...
t.Days
...
 
Zuletzt bearbeitet:
Zurück
Oben