给定DateTime和DayOfWeek应该返回该月的最后一个DayOfWeek的日期.
例如2009年3月1日和周日将于2009年3月29日回归
找不到一个方便的单行,但这个工作:
static DateTime LastDayOfWeekInMonth(DateTime day, DayOfWeek dow) { DateTime lastDay = new DateTime(day.Year, day.Month, 1).AddMonths(1).AddDays(-1); DayOfWeek lastDow = lastDay.DayOfWeek; int diff = dow - lastDow; if (diff > 0) diff -= 7; System.Diagnostics.Debug.Assert(diff <= 0); return lastDay.AddDays(diff); }
http://datetimeextensions.codeplex.com/有一个Last(dayOfWeek)扩展方法,可以为您完成此操作
测试包括:-)
获取下个月的第一天,然后找到该月的第一个工作日.回到七天,你就是在正确月份的最后一周的那个工作日:
DateTime date = new DateTime(2009, 3, 12); DayOfWeek day = DayOfWeek.Sunday; DateTime nextMonth = new DateTime(date.Year, date.Month, 1).AddMonths(1); while (nextMonth.DayOfWeek != day) { nextMonth = nextMonth.AddDays(1); } DateTime lastInMonth = nextMonth.AddDays(-7);
(您可以使用一些算法来替换循环,该算法根据DayOfWeek值的数值计算要添加的天数,但这更直接.)
编辑:
您当然也可以获得当月的最后一天,然后向后循环,直到找到正确的工作日.