/// <summary> /// 해당 월의 주차 정보를 반환한다. /// </summary> /// <param name="dayOfWeek">첫 주에 해당 요일이 있는 경우, |dayOfWeek| ~ 일요일까지 1주차라고 간주한다.</param> public static DateWeekRange[] WeekRangesOfMonth(this DateTimeOffset self, DayOfWeek dayOfWeek) { var beginOfMonth = self.BeginOfMonth(); var endOfMonth = self.EndOfMonth(); var list = new List <DateWeekRange>(); var firstDate = DayOfWeek.Monday; // 가장 첫번째 월요일을 찾는다. var firstMonday = self.FirstDateInMonth(firstDate); if (firstMonday.Day > beginOfMonth.Day) { // 월 첫번째 날짜(1일)가 첫번째 월요일 날짜보다 이전이라면 // |beginOfMonth| ~ |firstMonday.Day - 1|까지 |dayOfWeek|이 있는지 체크한다. DateTimeOffset?find = null; for (int i = 0; i < firstMonday.Day - 1; i++) { var temp = beginOfMonth.AddDays(i); if (temp.DayOfWeek == dayOfWeek) { find = temp; break; } } // => 있다면 |beginOfMonth| ~ |firstMonday.Day - 1| 기간을 첫번째 주로 간주한다. if (find.HasValue) { list.Add(new DateWeekRange { Month = beginOfMonth.Month, Week = 1, BeginDate = beginOfMonth, EndDate = firstMonday.AddTicks(-1) }); } // => 없다면 지난 달의 마지막 주로 간주한다. else { list.Add(new DateWeekRange { Month = self.AddMonths(-1).Month, Week = DayOfWeekCountInMonth(self, dayOfWeek), BeginDate = BeginOfWeek(self, firstDate), EndDate = EndOfWeek(self, firstDate) }); } } var currentDate = firstMonday; bool stop = false; while (true) { if (stop) { break; } var begin = currentDate.BeginOfDate(); var end = begin.AddDays(7).AddTicks(-1); list.Add(new DateWeekRange { Month = begin.Month, Week = list.Count + 1, BeginDate = begin, EndDate = end }); currentDate = end.AddTicks(1); stop = begin.Month != currentDate.Month; } return(list.ToArray()); }