コード例 #1
0
        /// <summary>
        /// <paramref name="current"/> 기준으로 예외기간 등을 고려한 선행의 WeekRange를 구합니다.
        /// </summary>
        /// <param name="current"></param>
        /// <returns></returns>
        private WeekRange FindPreviousWeek(WeekRange current)
        {
            if (IsDebugEnabled)
            {
                log.Debug("현 Week [{0}]의 이전 Week 기간을 구합니다...", current);
            }

            WeekRange result;

            if (ExcludePeriods.Count == 0)
            {
                result = current.GetPreviousWeek();
            }
            else
            {
                var limits           = new TimeRange(DateTime.MinValue, current.Start.AddTicks(-1));
                var gapCalculator    = new TimeGapCalculator <TimeRange>(TimeCalendar);
                var remainingPeriods = gapCalculator.GetGaps(ExcludePeriods, limits);

                result = (remainingPeriods.Count > 0)
                             ? new WeekRange(remainingPeriods[remainingPeriods.Count - 1].End, TimeCalendar)
                             : null;
            }

            if (IsDebugEnabled)
            {
                log.Debug("현 Week의 이전 Week 기간을 구했습니다. current=[{0}], next=[{1}]", current, result);
            }

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// <paramref name="current"/> 기준으로 예외 기간 등을 고려한 후행의 가장 근접한 WeekRange를 구합니다.
        /// </summary>
        /// <param name="current"></param>
        /// <returns></returns>
        private WeekRange FindNextWeek(WeekRange current)
        {
            if (IsDebugEnabled)
            {
                log.Debug("현 Week [{0}]의 다음 Week 기간을  구합니다...", current);
            }

            WeekRange result;

            if (ExcludePeriods.Count == 0)
            {
                result = current.GetNextWeek();
            }
            else
            {
                var limits           = new TimeRange(current.End.AddTicks(1), DateTime.MaxValue);
                var gapCalculator    = new TimeGapCalculator <TimeRange>(TimeCalendar);
                var remainingPeriods = gapCalculator.GetGaps(ExcludePeriods, limits);

                result = (remainingPeriods.Count > 0) ? new WeekRange(remainingPeriods[0].Start, TimeCalendar) : null;
            }

            if (IsDebugEnabled)
            {
                log.Debug("현 Week의 다음 Week 기간을 구했습니다. current=[{0}], next=[{1}]", current, result);
            }

            return(result);
        }
コード例 #3
0
        private void SetRangeOfWeeks()
        {
            IDateSpan range = ScheduleView.VisibleRange;

            _firstWeek  = CreateSevenDaysWeek(range.Start, true);
            _secondWeek = CreateSevenDaysWeek(_firstWeek.End, false);
            _thirdWeek  = CreateSevenDaysWeek(_secondWeek.End, false);
            _fourthWeek = CreateSevenDaysWeek(_thirdWeek.End, false);
            _fifthWeek  = CreateSevenDaysWeek(_fourthWeek.End, false);
        }
コード例 #4
0
        private WeekRange CreateSevenDaysWeek(DateTime start, bool isFirstWeek)
        {
            WeekRange w = new WeekRange();

            if (isFirstWeek)
            {
                w.Start = start;
            }
            else
            {
                w.Start = start.AddDays(1);
            }

            w.End = w.Start.AddDays(6);

            return(w);
        }
コード例 #5
0
        /// <summary>
        /// <paramref name="start"/>시각으로부터 <paramref name="offset"/> 만큼 떨어진 시각을 구합니다.
        /// </summary>
        /// <param name="start">기준 시각</param>
        /// <param name="offset">기간</param>
        /// <param name="seekDirection">검색 방향 (이전|이후)</param>
        /// <param name="seekBoundaryMode">검색 값 포함 여부</param>
        /// <returns>기준 시각으로터 오프셋만큼 떨어진 시각</returns>
        protected DateTime?CalculateEnd(DateTime start, TimeSpan offset, SeekDirection seekDirection, SeekBoundaryMode seekBoundaryMode)
        {
            if (IsDebugEnabled)
            {
                log.Debug("기준시각으로부터 오프셋만큼 떨어진 시각을 구합니다... " +
                          @"start=[{0}], offset=[{1}], seekDirection=[{2}], seekBoundaryMode=[{3}], Calendar=[{4}]",
                          start, offset, seekDirection, seekBoundaryMode, TimeCalendar);
            }

            Guard.Assert(offset >= TimeSpan.Zero, "offset 값은 TimeSpan.Zero 이상이어야 합니다. offset=[{0}]", offset);

            DateTime?end       = null;
            DateTime moment    = start;
            TimeSpan?remaining = offset;

            var week = new WeekRange(start, TimeCalendar);

            while (week != null)
            {
                base.IncludePeriods.Clear();
                base.IncludePeriods.AddAll(GetAvailableWeekPeriods(week));

                if (IsDebugEnabled)
                {
                    log.Debug("가능한 기간은=[{0}]", base.IncludePeriods.CollectionToString());
                }

                end = CalculateEnd(moment, remaining.Value, seekDirection, seekBoundaryMode, out remaining);

                if (end != null || remaining.HasValue == false)
                {
                    break;
                }

                if (seekDirection == SeekDirection.Forward)
                {
                    week = FindNextWeek(week);
                    if (week != null)
                    {
                        moment = week.Start;
                    }
                }
                else
                {
                    week = FindPreviousWeek(week);
                    if (week != null)
                    {
                        moment = week.End;
                    }
                }
            }

            if (IsDebugEnabled)
            {
                log.Debug("기준시각으로부터 오프셋만큼 떨어진 시각을 구했습니다!!! " +
                          @"start=[{0}], offset=[{1}], seekDirection=[{2}], seekBoundaryMode=[{3}], Calendar=[{4}], end=[{5}], remaining=[{6}]",
                          start, offset, seekDirection, seekBoundaryMode, TimeCalendar, end, remaining);
            }

            return(end);
        }
コード例 #6
0
        // GET api/<controller>/5
        public WeekRangeResponse Post([FromBody] WeekRange req)
        {
            var response = WeekRange.ProcessRequest(req);

            return(response);
        }