2016-07-26 3 views
0

Ich habe eine App entwickelt, um zu berechnen, wie viele Stunden Mitarbeiter arbeiten. Ich muss für jede Woche total zeigen. Um das zu tun, gehe ich jeden Tag weiter und benutze jeden Tag die Add() - Methode. Am Ende schreibe ich Stunden und Minuten auf ein Etikett.Zeitspanne verwenden, um Intervalle über 24 Stunden hinzuzufügen

foreach (DataRow day in days.Rows) 
{ 
    TimeSpan tsToAdd = new TimeSpan((int)day["hours"], (int)day["minutues"],0); 
    ts = ts.Add(tsToAdd); 
} 
label.text= ts.Hours.ToString("00") + ":" + ts.Minutes.ToString("00"); 

Aber wenn ts.hours 24 überschreitet, es neu starten von 0. Beispiel: 25 Stunden und 30 Minuten wurden 1 Stunde und 30 Minuten. Ich versuche, TotalHour und TotalMinutes zu verwenden, aber es ist nicht das, was ich will.

Wie wird zum Beispiel "30:20" angezeigt?

Thx

+0

Was ist los mit 'TotalHours'? '((int) ts.TotalHours) .ToString (" 00 ")' – CompuChip

+0

Wenn ich 4 Tage mit insgesamt 36 Stunden habe, sind die Gesamtstunden korrekt, aber die Gesamtminuten zeigen die Minuten in 36 Stunden, das Ergebnis ist also 36: 2160 – Daniele

+0

Verwenden Sie nicht 'TotalHours' * und *' TotalMinutes', verwenden Sie 'TotalHours' * mit *' Minutes' (siehe unten) –

Antwort

1

TimeSpan versucht innerhalb der normalen Konventionen für die Taktzeiten alle ihre Werte zu halten - so Hours immer im Bereich von 0 bis 23 sein sollte, Minutes ist immer 0-59 usw. Wenn Sie ein TimeSpan mit 25 Stunden erstellen, wird es erkennen, dass dies ein Tag und eine Stunde ist, so wird Hours als 1 angezeigt, während auch 1 wird.

Sie können die Gesamtzahl der Stunden, die durch TimeSpan dargestellt werden, mit der TotalHours-Eigenschaft ermitteln. Dies ist ein float, und umfasst auch die Minuten, Sekunden etc. in der TimeSpan, so dass eine Zeitspanne von 1 Tag, 1 Stunde und 1 Minute einen TotalHours Wert von 25.01666667 hat.

Um die Stunden wie gewünscht anzuzeigen, müssen Sie diese Bruchkomponente bei der Formatierung von TotalHours für die Anzeige verwerfen. Math.Floor scheint eine gute Wahl dafür zu sein, aber es wird nicht für negative Zeitspannen funktionieren, also ist die richtige Wahl Math.Truncate.

Math.Truncate(ts.TotalHours).ToString("00") + ":" + ts.Minutes.ToString("00") 

Obwohl eigentlich, wenn ToString mit einem solchen Format-String verwenden, der Math.Truncate Anruf nicht notwendig ist, da es die gleiche Wirkung hat, so versehen Sie eine Zeichenfolge möchten, können Sie es auslassen.

+0

Thx Mattew, es funktioniert! – Daniele

+0

Uhm ... heute habe ich ein Problem Ihre Lösung mit: Wenn meine letzte Zeitspanne TotalHours ist = -4,333333333333333 TotalHours = -20 yuor sintax Unter Verwendung Endergebnis ist "-05: 20" Stattdessen würde ich habe erwartet "-04: 20" – Daniele

+0

Ja, ich habe keine negativen Werte berücksichtigt. 'Floor' geht bei Negativen in die falsche Richtung, da Sie auf Null und nicht streng nach unten runden möchten. 'Math.Truncate' ist das, was Sie mit beiden bearbeiten möchten, indem Sie die zu bearbeitende Antwort bearbeiten. –

1

Sie können die TotalHours Eigenschaft die Gesamt (fraktionierten) Anzahl der Stunden zu bekommen.

Also statt, vielleicht:

label.text = string.Format("{0:N2}:{1:N2}", Math.Floor(ts.TotalHours) + ":" + ts.Minutes); 
Verwandte Themen