【问题标题】:Showing Difference between two datetime values in hours以小时为单位显示两个日期时间值之间的差异
【发布时间】:2011-02-09 14:39:44
【问题描述】:

我正在从数据库中检索两个日期时间值。检索到值后,我需要两个值之间的差异。 为此,我创建了一个时间跨度变量来存储两个日期值的差异。

TimeSpan? variable = datevalue1 - datevalue2;

现在我需要根据小时数显示存储在 Timespan 变量中的差异。 我提到了TimeSpan.TotalHours,但由于某种原因无法应用。 我怎么做? 我在 MVC 项目上使用 C#。我只需要以小时为单位显示差异值吗?

编辑: 由于时间跨度可以为空,我无法使用总小时数属性。现在我可以通过 TimeSpanVal.Value.TotalHours 来使用它;

【问题讨论】:

  • 为什么不能使用TimeSpan.TotalHours
  • 它不允许我这样做。我试过了。 :(
  • 是因为我的时间跨度可以为空,我不能使用 totalhours 属性吗?
  • 查看codegateway.com/2012/01/c-datetime-difference.html上的日期时间差、小时差、分钟差示例
  • TimeSpan 对象的总小时数为.Value.TotalHours

标签: c# asp.net-mvc-2 datetime timespan


【解决方案1】:

你可能还想看看

var hours = (datevalue1 - datevalue2).TotalHours;

【讨论】:

  • 但在这种情况下系统显示“'System.Nullable'不包含'TotalHours'的定义并且没有扩展方法'TotalHours'接受'System.'类型的第一个参数。 Nullable' 可以找到“。你能告诉我它的原因吗?
  • Nullable 需要一个 .Value.TotalHours 而不仅仅是 .TotalHours。这是可空包装的一个因素。您也可以将其转换为时间跨度 --> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)).TotalHours
【解决方案2】:

我认为你很困惑,因为你没有声明一个 TimeSpan 你已经声明了一个 TimeSpan? 这是一个 nullable TimeSpan。如果您不需要它可以为空,请删除问号或使用variable.Value.TotalHours

【讨论】:

    【解决方案3】:

    在示例中,我们创建了两个日期时间对象,一个包含当前时间,另一个添加了当前时间 75 秒。然后我们将在第二个 DateTime 对象上调用方法 .Subtract()。这将返回一个 TimeSpan 对象。 一旦我们得到 TimeSpan 对象,我们就可以使用 TimeSpan 的属性来获取实际的小时、分钟和秒。

    DateTime startTime = DateTime.Now;
    
     DateTime endTime = DateTime.Now.AddSeconds( 75 );
    
     TimeSpan span = endTime.Subtract ( startTime );
     Console.WriteLine( "Time Difference (seconds): " + span.Seconds );
     Console.WriteLine( "Time Difference (minutes): " + span.Minutes );
     Console.WriteLine( "Time Difference (hours): " + span.Hours );
     Console.WriteLine( "Time Difference (days): " + span.Days );
    

    结果:

    Time Difference (seconds): 15
    Time Difference (minutes): 1
    Time Difference (hours): 0
    Time Difference (days): 0
    

    【讨论】:

    • 您想使用“Total”,例如TotalSecondsTotalMinutes
    【解决方案4】:

    您使用Nullable 有什么原因吗?

    如果你想使用Nullable,那么你可以写variable.Value.TotalHours

    或者你可以写:(datevalue1 - datevalue2).TotalHours

    【讨论】:

    • 可能是因为 datevalue1 或 datevalue2 是DateTime?
    • @Filip,没关系,应该是DateTime。在 .NET 中,DateTime - DateTime = TimeSpan.
    • @Illya,我的意思是他们可能是Nullable<DateTime>,因此你得到一个Nullable<TimeSpan>
    • 你的回答真的很有效。我正在寻找它。
    【解决方案5】:

    这是另一个在 C# 中减去两个日期的示例 ...

    if ( DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24 ) 
    { 
    ... 
    } 
    

    【讨论】:

      【解决方案6】:

      一种更精确的员工支付时间或其他精确要求的方式:

      decimal DeterminePreciseHours(DateTime startTimestamp, DateTime stopTimestamp)
      {
          var span = (stopTimestamp - startTimestamp).Value;
          decimal total = (decimal)span.TotalMilliseconds / 60 / 60 / 1000;
          return Math.Round(total, PRECISION_CONSTANT);
      }
      

      https://dotnetfiddle.net/tVIoVJ

      【讨论】:

        【解决方案7】:
        var startTime = new TimeSpan(6, 0, 0); // 6:00 AM
        var endTime = new TimeSpan(5, 30, 0); // 5:30 AM 
        var hours24 = new TimeSpan(24, 0, 0);
        var difference = endTime.Subtract(startTime); // (-00:30:00)
        difference = (difference.Duration() != difference) ? hours24.Subtract(difference.Duration()) : difference; // (23:30:00)
        

        如果我们比较两个不同的日期,还可以添加日期之间的差异

        new TimeSpan(24 * days, 0, 0)
        

        【讨论】:

          【解决方案8】:

          哇,我得说:保持简单:

          MessageBox.Show("Result: " + (DateTime.Now.AddDays(10) > DateTime.Now));
          
          Result: True
          

          和:

          MessageBox.Show("Result: " + DateTime.Now.AddDays(10).Subtract(DateTime.Now));
          
          Result: 10.00:00:00
          

          DateTime 对象具有处理布尔结果的所有内置逻辑。

          【讨论】:

            猜你喜欢
            • 2017-06-24
            • 1970-01-01
            • 1970-01-01
            • 2013-09-15
            • 1970-01-01
            • 2012-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多