public Add ( System.DateTime start, System.TimeSpan offset, SeekBoundaryMode seekBoundaryMode = SeekBoundaryMode.Next ) : DateTime? | ||
start | System.DateTime | 시작 시각 |
offset | System.TimeSpan | 기간(Duration) |
seekBoundaryMode | SeekBoundaryMode | 검색시 경계에 대한 모드 |
Результат | DateTime? |
public virtual DateTime? Add(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.Add(offset);
TimeSpan? remaining;
var end = offset < TimeSpan.Zero
? CalculateEnd(start, offset.Negate(), SeekDirection.Backward, seekBoundaryMode, out remaining)
: CalculateEnd(start, offset, SeekDirection.Forward, 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 PeriodLimitsAddTest() { var test = new DateTime(2011, 4, 12); var timeRange1 = new TimeRange(new DateTime(2011, 4, 20), new DateTime(2011, 4, 25)); // 4월 20일~4월25일 var timeRange2 = new TimeRange(new DateTime(2011, 4, 30), null); // 4월 30일 이후 var dateAdd = new DateAdd(); // 예외 기간을 설정합니다. 4월20일 ~ 4월25일, 4월30일 이후 // dateAdd.ExcludePeriods.Add(timeRange1); dateAdd.ExcludePeriods.Add(timeRange2); dateAdd.Add(test, DurationUtil.Day).Should().Be(test.Add(DurationUtil.Day)); //! 4월 12일에 8일을 더하면 4월 20일이지만, 20~25일까지 제외되므로, 4월 25일이 된다. // dateAdd.Add(test, DurationUtil.Days(8)).Should().Be(timeRange1.End); //! 4월 20일에 20일을 더하면, 4월 20~25일 제외 후를 계산하면 4월 30일 이후가 된다. 하지만 4월 30일 이후는 제외가 되므로, 결과값은 null이 된다. // dateAdd.Add(test, DurationUtil.Days(20)).HasValue.Should().Be.False(); dateAdd.Subtract(test, DurationUtil.Days(3)).Should().Be(test.Subtract(DurationUtil.Days(3))); }