【问题标题】:If Statement Hell, How to check if a date passed matches a date within 3 days but only if the date doesnt match the other conditionsIf Statement Hell, 如何检查过去的日期是否与 3 天内的日期匹配,但前提是该日期与其他条件不匹配
【发布时间】:2010-11-30 16:54:16
【问题描述】:

正如乱码问题所说,我基本上是在寻找一种更整洁的方法来执行以下 sn-p。 (它在日历中用于可用性匹配)

        if (date.Year == now.Year && date.Month == now.Month && day == now.Day)
        {
            daysHtml.Append("<td class=\"today\">" + day.ToString() + "</td>");
        }
        else if (((day == SelectedDate.Day)
               || (day != SelectedDate.Day && ((day == SelectedDate.AddDays(1).Day || (SelectedDate.Day > 3 && day == SelectedDate.AddDays(-1).Day)) && (day != SelectedDate.AddDays(2).Day || (SelectedDate.Day > 3 && day != SelectedDate.AddDays(-2).Day) || day != SelectedDate.AddDays(3).Day || (SelectedDate.Day > 3 && day != SelectedDate.AddDays(-3).Day))))
               || (day != SelectedDate.Day && ((day == SelectedDate.AddDays(2).Day || (SelectedDate.Day > 3 && day == SelectedDate.AddDays(-2).Day)) && (day != SelectedDate.AddDays(3).Day || (SelectedDate.Day > 3 && day != SelectedDate.AddDays(-3).Day) || day != SelectedDate.AddDays(1).Day || (SelectedDate.Day > 3 && day != SelectedDate.AddDays(-1).Day))))
               || (day != SelectedDate.Day && ((day == SelectedDate.AddDays(3).Day || (SelectedDate.Day > 3 && day == SelectedDate.AddDays(-3).Day)) && (day != SelectedDate.AddDays(2).Day || (SelectedDate.Day > 3 && day != SelectedDate.AddDays(-2).Day) || day != SelectedDate.AddDays(1).Day || (SelectedDate.Day > 3 && day != SelectedDate.AddDays(-1).Day)))))
               && ((double)endprice > 0) && (SelectedDate.Month == date.Month))
        {}

你的耳朵和眼睛现在可能会流血;)

只是为了澄清...... SelectedDate 是传递给日历的日期。日是月中的日。 (而循环日

基本上我正在传递一个我需要检查的日期(比如 27/11/2010,即 SelectedDay):

  • SelectedDay 是添加到字符串中的当前日历日。
  • 如果不是,那么如果我在选定日期中添加一天,是否匹配,如果不匹配,则为两天,再次为三天。

但是因为它是一个日期,我必须检查它是否超过第 3 天,然后才允许它检查它是否可以匹配负 3 天(或者上个月的结束将用于标记本月的结束)


回答

最后我使用了以下语法。

        DateTime currentCalDate = DateTime.Parse(String.Format("{0}/{1}/{2}", day, SelectedDate.Month, SelectedDate.Year));
        int daysToAdd = (currentCalDate.Day + 3 < days) ? 3 : 0;
        int daysToDeduct = (currentCalDate.Day - 3 > 0) ? -3 : 0;

else if ((SelectedDate >= currentCalDate.AddDays(daysToDeduct) && SelectedDate <= currentCalDate.AddDays(daysToAdd)) && ((double)endprice > 0))

:)

【问题讨论】:

  • 无论如何你可以用书面形式而不是通过代码来阐明逻辑吗?正如我所看到的,您正在尝试查看日期是否是今天,如果不是,那么它是否在选定日期的三天内。对吗?
  • 什么是天变量? date.Day == day?
  • 您在我澄清问题时输入了问题 :o) 基本上我通过了一个日期(比如 27/11/2010,即 SelectedDay),我需要对其进行测试。 SelectedDay 是被添加到字符串中的当前日历日。如果不是,那么如果我在 Selected Day 中添加一天,是否匹配,如果不匹配,则为两天,再次为三天。

标签: asp.net-mvc date if-statement .net-3.5 c#-3.0


【解决方案1】:

if 语句可以先缩短:

if (date.Date == now.Date)

【讨论】:

    【解决方案2】:

    我认为您可以改进语句的第二(长)部分。通过创建两个单独的日期对象,一个在选定日期后 3 天,一个在未来 3 天,然后您可以查看您的日期是否介于这两个点之间。

    例如(在伪代码中):

    if day > earlierDay && day < laterDay then
    {
      //day falls within 3 days of selected day
    }
    

    将它与您的其他 if 条件结合起来,这应该等同于您上面的条件(假设我已经理解您的逻辑!)

    更新: 有了更多信息,我想您可以做一些非常相似的事情,但要查看整个日期对象而不仅仅是一天。我承认我不熟悉用于日期比较的 .net 语法,但如果那里还没有,那么我会编写一个简短的辅助方法来比较两个日期,看看一个是否在另一个之前。这也可以允许几个月。这也意味着您的 if 语句可以保持简洁。不需要很聪明,只需进行基本的日期比较,首先检查年份,然后是月份,然后是日期。

    【讨论】:

    • 有点对,我需要比较整个日期,而不仅仅是天数,否则我必须处理没有在月末增加 3 天或从月初减少 3 天的测试月。
    • 我作弊了查看添加到问题中的答案:o)
    【解决方案3】:

    第二条语句还有一些无用的逻辑……

    所有3个分支都有

    (day != SelectedDate.Day ...
    

    这总是正确的,因为您已经设法通过 elseif 的开头,其中状态

    else if (((day == SelectedDate.Day)


    这是改版后的 else 块...

            {
                DateTime SelectedDate = DateTime.Now.AddDays(-3);
    
                float endprice = 14;
    
                int nextDay = SelectedDate.AddDays(1).Day;
                int prevDay = SelectedDate.AddDays(-1).Day;
                int dayAfterNext = SelectedDate.AddDays(2).Day;
                int dayBeforeYesterday = SelectedDate.AddDays(-2).Day;
                int dayThreeDaysAgo = SelectedDate.AddDays(-3).Day;
                if (((day == SelectedDate.Day)
                     ||
                     (
                         ((day == nextDay ||
                           (SelectedDate.Day > 3 && day == prevDay)) &&
                          (day != dayAfterNext ||
                           (SelectedDate.Day > 3 && day != dayBeforeYesterday) ||
                           day != SelectedDate.AddDays(3).Day
                           || (SelectedDate.Day > 3 && day != dayThreeDaysAgo))))
                     ||
                     (
                         ((day == dayAfterNext ||
                           (SelectedDate.Day > 3 && day == dayBeforeYesterday)) &&
                          (day != SelectedDate.AddDays(3).Day ||
                           (SelectedDate.Day > 3 && day != dayThreeDaysAgo) ||
                           day != nextDay ||
                           (SelectedDate.Day > 3 && day != prevDay)))) ||
                     (
                         ((day == SelectedDate.AddDays(3).Day ||
                           (SelectedDate.Day > 3 && day == dayThreeDaysAgo)) &&
                          (day != dayAfterNext ||
                           (SelectedDate.Day > 3 && day != dayBeforeYesterday) ||
                           day != nextDay ||
                           (SelectedDate.Day > 3 && day != prevDay)))))
                    && (endprice > 0) && (SelectedDate.Month == date.Month))
                {
                }
            }
    

    【讨论】:

      【解决方案4】:
      var selectedDate = DateTime.Now.Date.AddDays(-23);
      var today = DateTime.Now.Date.AddDays(-22);
      
      var check = new HashSet<int>();
      foreach (var i in Enumerable.Range(-3,7))
        if (selectedDate.AddDays(i).ToString("yyyyMM") == today.ToString("yyyyMM"))
          check.Add(selectedDate.AddDays(i).Day);
      
      if (selectedDate == today)
      {
        // today
      }
      else if (check.Contains(selectedDate.Day))
      {
        // within 3 days";
      }
      

      这很遗憾吗?

      【讨论】:

        猜你喜欢
        • 2018-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多