2016-07-26 132 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);