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

Use timespan to add intervals over 24 hours

我有一个旨在计算员工工作小时数的应用程序。我必须每周显示总计。为此,我每天循环,并且每天都使用 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”?

感谢

您可以使用 TotalHours 属性 获取总(小数)小时数。

因此,也许:

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 表示的总小时数。这是一个 float,并且在 TimeSpan 中也包括分钟、秒等,因此 1 天 1 小时 1 分钟的跨度具有 TotalHours25.01666667.

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

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

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