/// <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); }
/// <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); }
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); }
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); }
/// <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); }
// GET api/<controller>/5 public WeekRangeResponse Post([FromBody] WeekRange req) { var response = WeekRange.ProcessRequest(req); return(response); }