这应该是您正在寻找的:
public static class Week
{
public static IEnumerable<DateTime> UpTo(DateTime upTo)
{
var lastMonday = upTo.DayOfWeek == DayOfWeek.Sunday
? upTo.AddDays(-6)
: upTo.AddDays(-(int) upTo.DayOfWeek + 1);
var lastSunday = lastMonday.AddDays(-1);
var sundayBefore = lastSunday.AddDays(-7);
var firstDayOfMonth = new DateTime(lastSunday.Year, lastSunday.Month, 1);
var startDay = firstDayOfMonth >= sundayBefore ? firstDayOfMonth : sundayBefore;
for (var day = startDay; day < lastSunday; day = day.AddDays(1))
yield return day;
}
}
我认为代码相当不言自明-也许唯一不太清楚的是我计算lastMonday的那一行-为此,您必须知道DayOfWeek是一个枚举,其中Monday是@ 987654325@ - 所以我得到一个代表星期几的数字并相应地减去一天。
可悲的是,我首先错过了一个边缘情况:Sunday 为 0,因此如果您从星期日开始,这将在 next 星期一得到 - 这就是额外检查的原因 - 以防万一你不能保证给一个星期一规则。
这里有两个 Xunit 测试用例检查您的标准:
[Fact]
public void SepTest()
{
var sunday = new DateTime(2014, 8, 24);
var expected = Enumerable.Range(0, 7).Select(d => sunday.AddDays(d));
var week = Week.UpTo(new DateTime(2014, 9, 1));
Assert.Equal(expected, week);
}
[Fact]
public void OctTest()
{
var wednesday = new DateTime(2014, 10, 1);
var expected = Enumerable.Range(0, 4).Select(d => wednesday.AddDays(d));
var week = Week.UpTo(new DateTime(2014, 10, 6));
Assert.Equal(expected, week);
}
[Fact]
public void Day_EdgeCase()
{
var sunday = new DateTime(2014, 8, 24);
var expected = Enumerable.Range(0, 7).Select(d => sunday.AddDays(d));
var week = Week.UpTo(new DateTime(2014, 9, 7));
Assert.Equal(expected, week);
}