Вы явно указываете даты, поэтому я предполагаю, что время не является проблемой, и мы можем игнорировать сложность летнего времени и т. Д. В этом случае вы можете сделать простое числовое выражение даты года и иметь небольшую логику для случаев обертывания. Я не говорю, что это красиво, но он доставляет тебя туда. Например:
void Main()
{
var range = new DateRange(new DateTime(2015,12,6), new DateTime(2016,1,2));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 12, 28)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 1)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 3)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 11, 28)));
}
public class DateRange
{
public const int OneYearWrap = 1200;
public int BeginValue { get; private set; }
public int EndValue { get; private set; }
public DateRange(DateTime begin, DateTime end)
{
BeginValue = DateValue(begin);
EndValue = DateValue(end);
if (EndValue < BeginValue)
EndValue += OneYearWrap;
}
public bool IsDateInRange(DateTime date)
{
int dateValue = DateValue(date);
if (EndValue > OneYearWrap && dateValue < BeginValue)
dateValue += OneYearWrap;
return dateValue >= BeginValue && dateValue <= EndValue;
}
int DateValue(DateTime date)
{
return date.Month * 100 + date.Day;
}
}
Недостаточные требования. Что делать за 29 февраля в качестве даты начала/окончания/проверки? И 6 dec - 2 jan не является «диапазоном года». Он перекрывает 2 года. –
@HenkHolterman это сложнее, чем я думал. Двухлетняя перекрывающаяся часть является преднамеренной. Не уверен, что делать с 29-м, а также с летним сбережением. – boot4life
Обратите внимание, что время тяжелое. http://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time –