public Subtract ( System.DateTime start, System.TimeSpan offset, SeekBoundaryMode seekBoundaryMode = SeekBoundaryMode.Next ) : DateTime? | ||
start | System.DateTime | 시작 시각 |
offset | System.TimeSpan | 기간(Duration) |
seekBoundaryMode | SeekBoundaryMode | 검색시 경계에 대한 모드 |
return | DateTime? |
public virtual DateTime? Subtract(DateTime start, TimeSpan offset, SeekBoundaryMode seekBoundaryMode = SeekBoundaryMode.Next) {
if(IsDebugEnabled)
log.Debug("Start 시각[{0}] + Duration[{1}]의 시각을 계산합니다.... SeekBoundaryMode=[{2}]", start, offset, seekBoundaryMode);
if(IncludePeriods.Count == 0 && ExcludePeriods.Count == 0)
return start.Subtract(offset);
TimeSpan? remaining;
var end = offset < TimeSpan.Zero
? CalculateEnd(start, offset.Negate(), SeekDirection.Forward, seekBoundaryMode, out remaining)
: CalculateEnd(start, offset, SeekDirection.Backward, seekBoundaryMode, out remaining);
if(IsDebugEnabled)
log.Debug("Start 시각[{0}] + Duration[{1}]의 시각 End=[{2}], remaining=[{3}] 입니다!!! SeekBoundaryMode=[{4}]",
start, offset, end, remaining, seekBoundaryMode);
return end;
}
public void PeriodLimitsSubtractTest() { var test = new DateTime(2011, 4, 30); var timeRange1 = new TimeRange(new DateTime(2011, 4, 20), new DateTime(2011, 4, 25)); var timeRange2 = new TimeRange(DateTime.MinValue, new DateTime(2011, 4, 6)); var dateAdd = new DateAdd(); // 예외 기간을 설정합니다. 4월 10일 이전, 4월20일 ~ 4월25일 // dateAdd.ExcludePeriods.Add(timeRange1); dateAdd.ExcludePeriods.Add(timeRange2); dateAdd.Subtract(test, DurationUtil.Days(1)).Should().Be(test.Subtract(DurationUtil.Days(1))); //! 4월 30일로부터 5일전이면 4월25일이지만, 예외기간이 4월20일~4월25일이므로, 4월20일을 반환합니다. // dateAdd.Subtract(test, DurationUtil.Days(5)).Should().Be(timeRange1.Start); //! 4월 30일로부터 20일전이면, 4월10일 이지만 예외기간이 4월20일~4월25일이 있어 4월 5일이 되지만 4월 6일 이전은 예외기간이라 null을 반환합니다. // dateAdd.Subtract(test, DurationUtil.Days(20)).HasValue.Should().Be.False(); dateAdd.Add(test, DurationUtil.Days(3)).Should().Be(test.Add(DurationUtil.Days(3))); }