private static ITimePeriod FindPreviousPeriod(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(ITimePeriod period in periods) {
// start가 기간에 속한다면...
if(period.HasInside(start)) {
nearestPeriod = period;
moment = start;
break;
}
// 기간이 이미 start 이후라면 (After)
if(period.Start > start)
continue;
// 근처 값이 아니라면 포기
//
var periodToMement = start - period.End;
if(periodToMement >= diffence)
continue;
diffence = periodToMement;
nearestPeriod = period;
moment = nearestPeriod.End;
}
if(IsDebugEnabled)
log.Debug("시작시각의 이전 기간을 찾았습니다!!! start=[{0}], moment=[{1}], nearestPeriod=[{2}]", start, moment, nearestPeriod);
return nearestPeriod;
}
}