private static ITimePeriod FindNextPeriod(DateTime start, IEnumerable<ITimePeriod> periods, out DateTime moment) {
//! assumes no no overlapping periods in parameter periods (HashSet<ITimePeriod> 겠지?)
if(IsDebugEnabled)
log.Debug("시작시각의 이후 기간을 찾습니다... start=[{0}], periods=[{1}]", start, periods.CollectionToString());
ITimePeriod nearestPeriod = null;
var diffence = TimeSpan.MaxValue;
moment = start;
foreach(var period in periods) {
// start가 기간에 속한다면...
if(period.HasInside(start)) {
nearestPeriod = period;
moment = start;
break;
}
// 기간이 start 이전이라면 (Before)
if(period.End < start)
continue;
// 근처 값이 아니라면 포기
var periodToMement = period.Start - start;
if(periodToMement >= diffence)
continue;
diffence = periodToMement;
nearestPeriod = period;
moment = nearestPeriod.Start;
}
if(IsDebugEnabled)
log.Debug("시작시각의 다음 기간을 찾았습니다!!! start=[{0}], moment=[{1}], nearestPeriod=[{2}]", start, moment, nearestPeriod);
return nearestPeriod;
}