如何检查所选的两个日期之间是否有任何星期日

本文关键字:两个 之间 日期 是否 星期日 任何 何检查 检查 | 更新日期: 2023-09-27 18:36:17

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

如何检查所选的两个日期之间是否有任何星期日

只需检查选择的前 7 天。

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

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

像这样:

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);
}

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

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

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
    }        
}

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

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 天那样进行优化,因此您可以找到一周中的某一天,或者您将到达结束日期。

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

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