如何检查所选的两个日期之间是否有任何星期日
本文关键字:两个 之间 日期 是否 星期日 任何 何检查 检查 | 更新日期: 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;
}