如何检查所选择的两个日期之间是否有星期天下降?

时间:2015-01-06 09:02:30

标签: c#

目前我有2个月的日历;一个用于开始日期,另一个用于结束日期。用户可以选择除星期日之外的任何日期。还有一个按钮,用于检查日期是否有效。如果用户选择了包含星期天的日期范围,则系统不应允许该日期并显示其无效的消息。我们如何使用C#进行此操作?

4 个答案:

答案 0 :(得分:5)

只需检查选择的前7天。

从所选的第一个日期开始,检查此日期,然后检查下一个日期,并执行以下操作:

  • 如果您最终超过用户选择的结束日期,那么您已经完成了,一切都很好
  • 如果你最后一个星期天,一切都不好

这样的事情:

for (int index = 0; index < 7; index++)
{
    DateTime dt = startDate.AddDays(index);
    if (dt > endDate)
        return true;
    if (dt.DayOfWeek == DayOfWeek.Sunday)
        return false;
}

请注意,在用户选择的开始日期和结束日期之间检查所有日期是没有意义的,因为周是100%重复出现的模式,它足以查看选择是否以包含周日的一周。

请注意,正如评论中所提到的,for循环实际上是不必要的。要么我们要到达结束日期,要么我们将在7个日期内找到一个星期日,所以我们可以重写上面的代码:

DateTime dt = startDate;
while (dt <= endDate)
{
    if (dt.DayOfWeek == DayOfWeek.Sunday)
        return false;
    dt = dt.AddDays(1);
}

我个人我发现第一个解决方案更容易理解和推理。

答案 1 :(得分:3)

假设您检查结束日期不在开始日期之前

while(start <= stop)
{
    if(start.DayOfWeek != DayOfWeek.Sunday)
    {
        // carry on if you don't want any basic functions done per check
    }
    else
    {
         //what ever you do if is sunday
    }        
}

答案 2 :(得分:2)

如果您有Range的概念,那么请考虑为其创建适当的数据类型。我建议将日期范围实现为Value Object

public class DateRange
{
   public DateTime Start { get; private set; }
   public DateTime End { get; private set; }

   public DateRange(DateTime startDate, DateTime endDate)
   {
       if (endDate < startDate)
          throw new ArgumentOutOfRangeException("endDate");

       Start = startDate;
       End = endDate;
   }
}

现在,当您拥有此数据类型时,可以轻松地为日期范围添加适当的行为。您可以添加检查某个日期是否在此范围内,或者(在您的情况下)如果某一天的某一天落在范围内:

public bool Contains(DayOfWeek day)
{
    var date = Start;

    while(date <= End)
    {
        if (date.DayOfWeek == day)
           return true;

        date = date.AddDays(1);
    }

    return false;
}

现在您的代码将如下所示:

var range = new DateRange(startDate, endDate);
if (range.Contains(DayOfWeek.Sunday))
     // show error message

注意 - 无需进行优化,例如只检查前7天,因此您可以找到您的星期几,也可以达到结束日期。

答案 3 :(得分:1)

为了好玩,请不要在生产中使用它,因为它取决于DayOfWeek枚举的实现:

public static bool DateRangeContainsASunday(DateTime start, DateTime end)
    {
        int days = (end - start).Days;
        return days => 7 || (int)end.DayOfWeek - days <= 0;
    }