【问题标题】:If condition not working as expected c#如果条件没有按预期工作c#
【发布时间】:2017-08-31 00:04:07
【问题描述】:

这现在困扰着我,我在过去的一个小时里试图修复它,但仍然没有成功!

我希望有人能发现我做错了什么。这是我的代码:

var maxDays = 30;
 DateTime today = DateTime.Now; //todays date
 DateTime lastAction = '2017-03-07 12:47:58.967';
  double totalDays = (lastAction - today).TotalDays;
  var days = Math.Round(totalDays);
if(days > maxDays)
{
  //never hits this even though days is greater than max days ..i'm so confused 
}

我做错了什么?

【问题讨论】:

  • 调试器向您展示了什么?
  • 什么调试器,它甚至不编译
  • 我给出了怀疑的好处,并假设真正的代码确实可以编译和运行
  • 如果您正在寻找 totalDays(自 lastAction 以来经过),不应该是(今天 - lastAction)。按照您的方式,days 将是一个负数,不会大于 maxDays 是一个正数。
  • 请学习使用调试器。通过将鼠标悬停在 if 中的变量上,您可以在 5 秒内自行解决这个问题。

标签: c#


【解决方案1】:

重复问题如下: C# Number of days between two dates problem

Timespan.TotalDays 可以是负数。所以在你的情况下,几乎可以保证 lastAction - today 是一个负数,所以总是小于 30。

如果您只关心天数的绝对值,请使用Math.Abs,否则重新排列,以便您从今天的(today - lastAction) 中减去lastAction。 请注意,由于四舍五入,如果相差不到 1 天,您的条件仍然不会触发。

【讨论】:

    【解决方案2】:

    您是否有可能从一个较小的值(lastaction)中减去一个较大的值(今天),这会导致负数使天数变为负数?

    您确实需要对字符串进行显式解析以使其成为日期:

    DateTime lastAction = DateTime.Parse("2017-03-07 12:47:58
         .967");
    

    【讨论】:

      【解决方案3】:

      几件事。

      首先,您不能像这样将字符串转换为 DateTime。你应该做这样的事情。 DateTime lastAction = DateTime.Parse("2017-03-07 12:47:58.967");

      其次,正如@MikeS 所说,您正在从 Today 中减去 lastAction,这会产生一个负数(在这种情况下它类似于 -173)。你应该翻转那个声明。 double totalDays = ( today - lastAction).TotalDays;

      你的整个部分应该是这样的。

      var maxDays = 30;
      DateTime today = DateTime.Now; //todays date
      DateTime lastAction = DateTime.Parse("2017-03-07 12:47:58.967");
      double totalDays = ( today - lastAction).TotalDays;
      var days = Math.Round(totalDays);
      if (days > maxDays)
      {
          // now this is hit
      }
      

      【讨论】:

        【解决方案4】:

        感谢您的帮助。我做了一些愚蠢的事情..我有

        double totalDays = (lastAction - today).TotalDays; // returns -176
        

        将我的代码更改为:

         double totalDays = (today - lastAction).TotalDays; //returns 176
        

        【讨论】:

        • 恕我直言-接受已经指出这一点的答案之一比创建新答案要好...
        【解决方案5】:

        你的第一个问题: 您没有将字符串解析为 DateTime。

        DateTime lastAction = Convert.ToDateTime("2017-03-07 12:47:58.967");

        你的第二个问题: 您收到一个负值,并检查它是否更大。

        var days = (Math.Round(totalDays)) * (-1);
        

        像这样,它应该可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-14
          • 2016-08-26
          • 2015-08-02
          • 2012-04-12
          • 2017-07-17
          • 1970-01-01
          • 2013-04-12
          相关资源
          最近更新 更多