Esempio n. 1
0
        /// <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());
        }