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