C# 使用timespan添加超过24小时的间隔

C# 使用timespan添加超过24小时的间隔,c#,timespan,C#,Timespan,我设计了一个应用程序来计算员工的工作时间。我每周都要显示总数。为了做到这一点,我每天循环,每天使用Add()方法。最后,我把小时和分钟写在标签上 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("0

我设计了一个应用程序来计算员工的工作时间。我每周都要显示总数。为了做到这一点,我每天循环,每天使用Add()方法。最后,我把小时和分钟写在标签上

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

您可以使用该属性获取总(分数)小时数

因此,也许:

label.text = string.Format("{0:N2}:{1:N2}", Math.Floor(ts.TotalHours) + ":" + ts.Minutes);
您可以使用该属性获取总(分数)小时数

因此,也许:

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

TimeSpan
尝试将其所有值保持在时钟时间的正常约定范围内-因此
Hours
应始终在0-23范围内,
Minutes
始终在0-59范围内。如果创建一个带有25小时的
TimeSpan
,它将意识到这是一天一小时,因此,
Hours
将显示为
1
,而
Days
也将显示为
1

您可以使用
TotalHours
属性获取由
TimeSpan
表示的总小时数。这是一个
浮动
,并且还包括
时间跨度中的分钟、秒等,因此1天、1小时和1分钟的跨度的
总小时数
值为
25.01666667

因此,要想显示所需的小时数,在格式化
TotalHours
以进行显示时,需要放弃该分数部分
Math.Floor
似乎是一个不错的选择,但它不适用于负时间跨度,因此正确的选择是
Math.Truncate

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

虽然实际上在使用带有这种格式字符串的
ToString
时,
Math.Truncate
调用是不必要的,因为它具有相同的效果,因此,如果您需要字符串,可以将其省略。

TimeSpan
尝试将其所有值保持在时钟时间的正常约定范围内-因此
Hours
应始终在0-23范围内,
Minutes
始终为0-59等。如果创建一个
TimeSpan
为25小时,它将意识到这是一天一小时,因此
Hours
将显示为
1
,而
Days
也将显示为
1

您可以使用
TotalHours
属性获取由
TimeSpan
表示的总小时数。这是一个
浮动
,并且还包括
时间跨度中的分钟、秒等,因此1天、1小时和1分钟的跨度的
总小时数
值为
25.01666667

因此,要想显示所需的小时数,在格式化
TotalHours
以进行显示时,需要放弃该分数部分
Math.Floor
似乎是一个不错的选择,但它不适用于负时间跨度,因此正确的选择是
Math.Truncate

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

虽然实际上在将
ToString
与这样的格式字符串一起使用时,
Math.Truncate
调用是不必要的,因为它具有相同的效果,所以只要您想要一个字符串,就可以将其省略。

TotalHours
有什么问题吗<代码>((int)ts.TotalHours)。ToString(“00”)
如果我有4天,总共36小时,总小时是正确的,但总分钟数显示36小时中包含的分钟数,因此结果是36:2160不要同时使用
TotalHours
TotalMinutes
,使用
TotalHours
minutes
(根据我下面的回答)
TotalHours
有什么问题<代码>((int)ts.TotalHours)。ToString(“00”)如果我有4天,总共36小时,总小时是正确的,但总分钟数显示36小时中包含的分钟数,因此结果是36:2160不要同时使用
TotalHours
TotalMinutes
,使用
TotalHours
minutes
(根据我下面的答案)嗯。。。今天,我有一个问题使用你的解决方案:如果我的最终时间是总计小时=-4.33 33 33 33 33 33 33 ToalTimes=20,使用You-SunCalf,最终结果是“-05:20”,而不是我预期的“-04:20”是的,我没有考虑负值。“代码>底片”的负片方向不对,因为你想朝着零的方向旋转,而不是严格地朝下旋转<代码>数学。截断是您想要处理两者的,编辑答案以匹配。嗯。。。今天,我有一个问题使用你的解决方案:如果我的最终时间是总计小时=-4.33 33 33 33 33 33 33 ToalTimes=20,使用You-SunCalf,最终结果是“-05:20”,而不是我预期的“-04:20”是的,我没有考虑负值。“代码>底片”的负片方向不对,因为你想朝着零的方向旋转,而不是严格地朝下旋转
Math.Truncate
是您想要处理这两个问题的,编辑答案以匹配。