【问题标题】:Comparing times when over 24 hours比较超过 24 小时的时间
【发布时间】:2016-12-21 15:27:17
【问题描述】:

我有一个 TimeSpan 字段,可以将花费在某事上的时间加起来。比如时间可以是 33 小时,所以格式是33:56:00

我想将此与 10 小时进行比较,以计算完成了多少小时。

TimeSpan totalActualHours = new TimeSpan(0, 0, 0, 0, 0);
if (totalActualHours > TimeSpan.Parse(txtEstimateHrs.Text))
{
     tmpOverHours = totalActualHours.Subtract(TimeSpan.Parse(txtEstimateHrs.Text));
} 

但由于totalActualHours 已超过 24 小时,因此格式会像 1.09:56:00 而不是 33:56:00。所以txtEstimateHrs.Text 等于 10,我想看看33:56:00 是否更大,如果是,那么它会增加多少小时?

所以代码是比较 if (1.09:56:00 > 10.00:00:00) 所以它永远不会进入 if 语句。

这里的问题是将小时转换为天的时间跨度,因此 33 小时更改为 1 天和 9 小时,txtEstimateHrs.Text 是整数 10,更改为 10 天。我需要两次都采用小时格式并能够比较它们

【问题讨论】:

  • 我不太确定这是否是重复的,但问题并不是很清楚。也许你可以尝试用另一个例子来解释它。您可以比较大于 24 小时的时间跨度。
  • @TimSchmelter 请看我的编辑
  • 只做tmpOverHours = (int)(totalActualHours.TotalHours - int.Parse(txtEstimateHrs.Text))
  • @Innat3 导致错误Cannot implicitly convert type 'int' to 'System.TimeSpan'
  • @user123456789 因为我知道您只想要超过几个小时,所以我将它们输出为整数值而不是时间跨度。你可以这样做:tmpOverHours = totalActualHours.Subtract(new TimeSpan(0, int.Parse(txtEstimateHrs.Text), 0, 0, 0));

标签: c# asp.net timespan


【解决方案1】:

您只需要使用适当的格式正确构造时间跨度对象。在您的情况下,您可以选择

时分秒

天、时、分、秒、毫秒

示例代码:

案例 1

TimeSpan tmpOverHours;
TimeSpan totalActualHours = new TimeSpan(33, 56, 0);
TimeSpan hoursToCompare = new TimeSpan(int.Parse(txtEstimateHrs.Text), 0, 0);

if (totalActualHours > hoursToCompare)
{
    tmpOverHours = totalActualHours.Subtract(hoursToCompare); 
}

案例 2

TimeSpan tmpOverHours;
TimeSpan totalActualHours = new TimeSpan(0, 33, 56, 0, 0);
TimeSpan hoursToCompare = new TimeSpan(0, int.Parse(txtEstimateHrs.Text), 0, 0, 0);

if (totalActualHours > hoursToCompare)
{
    tmpOverHours = totalActualHours.Subtract(hoursToCompare); 
}

【讨论】:

    【解决方案2】:

    您在执行此操作时似乎遇到了解析错误:

    TimeSpan.Parse(txtEstimateHrs.Text)
    

    如果文本为“10”,则解析方法会将值解释为天数。

    因此您可以将该代码更改为:

    TimeSpan.FromHours(int.Parse(txtEstimateHrs.Text))
    

    它将文本框中的数字解析为一个 int 并使用它来创建一个正确具有小时数而不是天数的 TimeSpan。

    编辑:附带说明,不要两次解析文本,最好使用一个变量来保存解析的 TimeSpan 然后使用它。

    【讨论】:

      【解决方案3】:

      我不确定我是否理解您的要求,但您可以使用TimeSpan.Compare() 方法。

      var t1 = new TimeSpan(33, 21, 12);
      var t2 = new TimeSpan(10, 0, 0);
      
      if (TimeSpan.Compare(t1, t2) > 0)
      {
          Console.WriteLine(t1.ToString() + " is longer");
      }
      

      编辑

      如果可以正确创建Timespan 对象,上述代码将正常工作。如果您使用 hh:mm:ss 格式的字符串,则需要拆分它们并调用正确的 Timespan 构造函数。如下所示:

      public static TimeSpan ConvertStringToTimeStamp(string s)
              {
                  // add checks for input like >0, not null or empty
      
                  var split = s.Split(':');
                  TimeSpan ts;
      
                  switch (split.Length)
                  {
                      case 3:
                          ts = new TimeSpan(int.Parse(split[0]),    // hours
                                             int.Parse(split[1]),   // minutes
                                             int.Parse(split[2]));  // seconds                            // seconds);
                          break;
                      case 2:
                          ts = new TimeSpan(int.Parse(split[0]),    // hours
                                             int.Parse(split[1]),    // minutes
                                             0);                     // 0 seconds
                          break;
                      case 1:
                          ts = new TimeSpan(int.Parse(split[0]),    // hours
                                             0,                     // 0 minutes
                                             0);                    // 0 seconds
                          break;
                      default:
                          throw new Exception("Invalid Input");
      
                  }
      
                  return ts;
              }
      

      【讨论】:

      • 请查看我的问题的编辑我希望我让问题更清楚
      • 更新了答案。
      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2017-02-03
      相关资源
      最近更新 更多