У кого-либо были бы какие-либо идеи того, как лучше всего вычислить сумму дней, которые пересекаются между двумя диапазонами даты?
Получите новый диапазон, определяемый более поздним из начал и более ранним из концов, и определите количество дней с начала эпохи для каждого дня в этом новом диапазоне.
Разница - это количество дней в пересечении. Принимайте только положительные значения.
Отредактировано для учета диапазонов вместо отдельных дат.
Вопрос задается между двумя диапазонами дат, а не двумя датами. (Отредактировано в ответ на комментарии)
Поэтому, если у вас есть 2 диапазона дат (r1s, r1e), вам нужно определить, что начинается первым, есть ли перекрытие и что такое перекрытие.
double overlap(DateTime r1s, DateTime r1e, DateTime r2s, DateTime r1e){
DateTime t1s,t1e,t2s,t2e;
if (rs1<rs2) //Determine which range starts first
{
t1s = r1s;
t1e = r1e;
t2s = r2s;
t2e = r2e;
}
else
}
t1s = r2s;
t1e = r2e;
t2s = r1s;
t2e = r1e;
}
if (t1e<t2s) //No Overlap
{
return -1;
}
if (t1e<t2e) //Partial Overlap
}
TimeSpan diff = new TimeSpan(t1e.Ticks - t2s.Ticks);
{
else //Range 2 totally withing Range 1
}
TimeSpan diff = new TimeSpan(t2e.Ticks - t2s.Ticks);
{
double daysDiff = diff.TotalDays;
return daysDiff;
}
Если я правильно понял ваш вопрос, вы спрашиваете о количестве дней, которые перекрывают два диапазона дат, например: Диапазон 1 = с 2010-1-1 по 2010-2-1 Диапазон 2 = 2010-1-5 - 2010-2-5 В этом примере количество пересекающихся дней будет равно 28 дням.
Вот пример кода для этого примера
DateTime rs1 = new DateTime(2010, 1, 1);
DateTime re1 = new DateTime(2010, 2, 1);
DateTime rs2 = new DateTime(2010, 1, 5);
DateTime re2 = new DateTime(2010, 2, 5);
TimeSpan d = new TimeSpan(Math.Max(Math.Min(re1.Ticks, re2.Ticks) - Math.Max(rs1.Ticks, rs2.Ticks) + TimeSpan.TicksPerDay, 0));