C#TimeSpan计算小时数

时间:2017-04-28 21:10:27

标签: c# timespan

我正在尝试在C#中创建一个时间卡解决方案,并且遇到一个星期工作总时数的问题。从下拉列表中,用户可以选择他们一天工作的小时数(例如5:30 - 5:30是工作小时数,而不是实际时间5:30)。用户将选择每个工作日的小时数,然后应用程序将总计一周的小时数。我写的应用程序总计了几个小时,但我有两个问题:如果我使用.Hours来增加小时数,那么当总数超过24时,我会遇到一个问题。当我使用.TotalHours时,它计算超过24 ok,但不知何故,当我选择时,它会随机增加一个小时:30个增量。这是我必须计算和显示总数的代码:

使用.Hours不允许总小时数超过24.相反,它会将24天转换为1天并再次开始添加小时数,从而丢失原来的24小时:

lblWorkgroupOneTotalTime.Text = (totalWeekOneHours.Hours).ToString("00") + 
                        ":" + (totalWeekOneHours.Minutes).ToString("00");

//using .TotalHours causes the calculation to randomly add an hour to the total:

lblWorkgroupTwoTotalTime.Text =
  (totalWeekTwoHours.TotalHours).ToString("00").TrimStart('0') + 
  ":" + (totalWeekTwoHours.Minutes).ToString("00");

我觉得我非常接近让一切正常工作,但我无法理解这一部分。

3 个答案:

答案 0 :(得分:0)

显示格式字符串为TotalHours的{​​{1}}的问题在于它将会向上舍入。如果您不想显示日期,您有几个选择:

  1. 使用"00" + Hours小时
  2. 使用Days * 24数小时
  3. TotalMinutes / 60转换为TotalHours,它将始终向下舍入
  4. 例如:

    int

    然后你可以输出它:

    var totalHours = (totalWeekOneHours.Days * 24) + totalWeekOneHours.Hours;
    // Or:
    var totalHours = totalWeekOneHours.TotalMinutes / 60;
    // Or:
    var totalHours = (int)totalWeekOneHours.TotalHours;
    

答案 1 :(得分:0)

这个怎么样: 将示例初始化30小时30分钟:

TimeSpan totalWeekThreeHours = new TimeSpan(30, 30, 0);

(我感觉Timespan比DateTime更好。)

然后:

var hours = (int)totalWeekThreeHours.TotalMinutes / 60;
var mins = totalWeekThreeHours.TotalMinutes % 60;

输出:

var example1 = hours + ":" + mins;
var example2 = String.Format("{0} hours {1} mins", hours, mins);
Console.WriteLine("Example 1: " + example1);
Console.WriteLine("Example 2: " + example2);

//Output:
//Example 1: 30:30
//Example2: 30 hours 30 minutes

答案 2 :(得分:0)

  

它随机增加一个小时

编程中没有任何内容发生"随机"。因此,在调试时,您的第一步应该始终是查找错误中的模式。只要你相信这个错误发生在"随机",你就会有一个心理障碍妨碍找到错误。

至于你的具体问题......

对于Total...的{​​{1}}个属性,这将是一个TimeSpan值,代表整个时间范围,以及您所用的单位。重新检索,包括任何小数金额。

例如,如果double值代表1小时45分钟,则TimeSpan值将为TotalHours。同时,您告诉1.75方法您希望将值四舍五入为最接近的整数值。因此,只要您的时间跨度小时数大于一半,该值就会向上舍入到下一个小时值。

如果您不想要这种行为,您应该在将其格式化为字符串之前自己截断该值:

ToString()

我也不明白为什么你只使用格式字符串lblWorkgroupTwoTotalTime.Text = string.Format("{0:0}:{1:00}", (int)totalWeekTwoHours.TotalHours, totalWeekTwoHours.Minutes); 来剥离事后的前导"00"。更容易就是不首先以那种方式格式化字符串。

最后,请注意格式化字符串的替代语法。你的方法(明确地调用0)很好,但我发现它很冗长。以上内容更简洁,并且可以更好地将格式与输入分开。