2016-07-26 131 views
0

我有一個應用程序旨在計算員工的工作時間。我必須每週顯示總數。要做到這一點,我每天都循環使用,並且每天都使用Add()方法。最後,我會在標籤上寫幾小時和幾分鐘。使用時間跨度在24小時內添加間隔

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"); 

但是,當ts.hours超過24時,它從0重新開始。例如,25小時30分鐘變成1小時30分鐘。 我嘗試使用TotalHour和TotalMinutes,但它不是我想要的。

如何顯示,例如「30:20」?

THX

+0

'TotalHours'有什麼問題? '((int)ts.TotalHours).ToString(「00」)' – CompuChip

+0

如果我有4天共36小時,總時數是正確的,但總的小時數顯示36小時內的分鐘數,所以結果是36: 2160 – Daniele

+0

不要同時使用'TotalHours' *和*'TotalMinutes',使用'Totalhours' * *'Minutes'(根據我的答案) –

回答

1

TimeSpan試圖保持它的正常慣例內的所有值的時鐘時間 - 所以Hours應始終在範圍0-23,Minutes總是0-59等。如果使用25小時創建TimeSpan,則會意識到這是一天一小時,因此Hours將顯示爲1,而Days也會是1

您可以使用TotalHours屬性獲取TimeSpan所表示的總小時數。這是一個float,並且在TimeSpan中也包含分鐘,秒等,因此1天,1小時和1分鐘的範圍的值爲,其值爲25.01666667

因此,要顯示您想要的時間,您需要在格式化TotalHours以供顯示時放棄該小數部分。 Math.Floor似乎是一個很好的選擇,但它不適用於負時間段,因此正確的選擇是Math.Truncate

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

雖然實際使用ToString這樣的格式字符串時,該Math.Truncate通話是沒有必要的,因爲它具有相同的效果,所以只要你想要一個字符串,你可以離開它。

+0

Thx Mattew,它的工作原理! – Daniele

+0

呃... ...今天我用你解決的問題:如果我的最後的時間跨度是 TotalHours = -4.333333333333333 TotalHours = -20 使用上你的sintax,最後的結果是「-05:20」 相反,我會預計「-04:20」 – Daniele

+0

是的,我沒有考慮負面價值。如果你想朝着零圓化,而不是嚴格向下,「地板」會在負方向上走錯方向。 'Math.Truncate'是你想要處理的兩個問題,編輯匹配的答案。 –

1

可以使用TotalHours屬性來獲取的總小時(分數)號。

所以取而代之,也許:

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