得到指定周数的开始和结束日期 #region 得到指定周数的开始和结束日期 public struct WeekRange ...{ public DateTime BeginDate, EndDate; } public static WeekRange GetWeekRange(int year, int weekNumber, CalendarWeekRule rule, DayOfWeek firstDayOfWeek) ...{ if (weekNumber > GetWeeksInYear(year, rule, firstDayOfWeek)) throw new Exception("Out of week number"); Calendar calendar = CultureInfo.InvariantCulture.Calendar; DateTime firstDateOfYear = new DateTime(year, 1, 1); int dayOfWeekIndex4ThisYearFirstDate = (int)calendar.GetDayOfWeek(firstDateOfYear); int firstDayOfWeekIndex = (int)firstDayOfWeek; int lastDayOfWeekIndex = firstDayOfWeekIndex + 6; WeekRange weekRange; int addDays, days; //1月1日 + days = 周的最后一天 if (dayOfWeekIndex4ThisYearFirstDate < firstDayOfWeekIndex) days = firstDayOfWeekIndex - dayOfWeekIndex4ThisYearFirstDate - 1; else days = lastDayOfWeekIndex - dayOfWeekIndex4ThisYearFirstDate; switch (rule) ...{ case CalendarWeekRule.FirstDay: if (weekNumber == 1) ...{ weekRange.EndDate = firstDateOfYear.AddDays(days); weekRange.BeginDate = weekRange.EndDate.AddDays(-6); } else ...{ addDays = days + 1 + (weekNumber - 2) * 7; weekRange.BeginDate = firstDateOfYear.AddDays(addDays); weekRange.EndDate = weekRange.BeginDate.AddDays(6); } break; case CalendarWeekRule.FirstFourDayWeek: default: if (days + 1 >= 4) ...{ if (weekNumber == 1) ...{ weekRange.EndDate = firstDateOfYear.AddDays(days); weekRange.BeginDate = weekRange.EndDate.AddDays(-6); } else ...{ addDays = days + 1 + (weekNumber - 2) * 7; weekRange.BeginDate = firstDateOfYear.AddDays(addDays); weekRange.EndDate = weekRange.BeginDate.AddDays(6); } } else ...{ addDays = days + 1 + (weekNumber - 1) * 7; weekRange.BeginDate = firstDateOfYear.AddDays(addDays); weekRange.EndDate = weekRange.BeginDate.AddDays(6); } break; case CalendarWeekRule.FirstFullWeek: if (dayOfWeekIndex4ThisYearFirstDate == firstDayOfWeekIndex) addDays = (weekNumber - 1) * 7; else addDays = days + 1 + (weekNumber - 1) * 7; weekRange.BeginDate = firstDateOfYear.AddDays(addDays); weekRange.EndDate = weekRange.BeginDate.AddDays(6); break; } return weekRange; } public static WeekRange GetWeekRange(int year, int weekNumber) ...{ return GetWeekRange(year, weekNumber, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); } public static int GetWeeksInYear(int year, CalendarWeekRule rule, DayOfWeek firstDayOfWeek) ...{ Calendar calendar = CultureInfo.InvariantCulture.Calendar; DateTime NextYearFirstDate = new DateTime(year + 1, 1, 1); DateTime ThisYearLastDate = NextYearFirstDate.AddDays(-1); int count = calendar.GetWeekOfYear(ThisYearLastDate, rule, firstDayOfWeek); if (NextYearFirstDate.DayOfWeek != firstDayOfWeek) count--; return count; } public static int GetWeeksInYear(int year) ...{ return GetWeeksInYear(year, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); } #endregion