@Brad 的观点是,一周中的任何一天都在一周的任何两天之间是有效的。但是,我们假设所讨论的一周中的两天是有序的。
也就是说,当我们说“是 2010 年 10 月 30 日(星期六)在星期五和星期日之间吗?” ,我们真的要问,“2010 年 10 月 30 日是星期五、星期六还是星期日?” .
这一观察使我们能够将问题分解为两个部分并轻松解决整个问题:
1)确定一周中的特定日子是否是一周中特定的一组日子之一(这是微不足道的)。
2) 确定一周中的一组日子,让你从一天到另一天。也就是说,我们想要一个函数,在给定“星期五”和“星期日”时返回“星期五、星期六、星期日”,并在给定“星期一”和“星期五”时返回“星期一、星期二、星期三、星期四、星期五”。这是问题的棘手部分。
为了解决第二个问题,我们基本上是从第一天走到第二天,中间的所有天都返回。为了正确地做到这一点,我们必须考虑这样一个事实,即第二天可能小于第一天(在代表性意义上,星期日 = 0 小于星期五 = 5)。因此,我们在整数空间中执行“步行”,如果小于第一天,则将第二天加 7。我们在“出路”处转换为星期几空间(即整数模 7)。
下面是解决这个问题的代码和一系列测试。“GetDaysBetweenInclusive”方法解决了问题#2,而“IsDayOfWeekBetween”将解决方案添加到问题#1并解决了OP的问题。
享受。
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
namespace DayOfWeekUtilities
{
public static class DayOfWeekHelpers
{
/// <summary>
/// returns all days of the week, inclusive, from day1 to day2
/// </summary>
public static IEnumerable<DayOfWeek> GetDaysBetweenInclusive(DayOfWeek day1,
DayOfWeek day2)
{
var final = (int)day2;
if(day2 < day1)
{
final += 7;
}
var curr = (int)day1;
do
{
yield return (DayOfWeek) (curr%7);
curr++;
} while (curr <= final);
}
/// <summary>
/// returns true if the provided date falls on a day of the
/// week between day1 and day2, inclusive
/// </summary>
public static bool IsDayOfWeekBetween(this DateTime date,
DayOfWeek day1,
DayOfWeek day2)
{
return GetDaysBetweenInclusive(day1, day2).Contains(date.DayOfWeek);
}
}
[TestFixture]
public class Tests
{
[Test]
public void Test()
{
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsFalse(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
}
}
}