Количество дней, пересекаясь между двумя диапазонами даты

У кого-либо были бы какие-либо идеи того, как лучше всего вычислить сумму дней, которые пересекаются между двумя диапазонами даты?

10
задан BoredOfBinary 3 June 2010 в 22:41
поделиться

3 ответа

Получите новый диапазон, определяемый более поздним из начал и более ранним из концов, и определите количество дней с начала эпохи для каждого дня в этом новом диапазоне.

Разница - это количество дней в пересечении. Принимайте только положительные значения.

Отредактировано для учета диапазонов вместо отдельных дат.

5
ответ дан 3 December 2019 в 20:02
поделиться

Вопрос задается между двумя диапазонами дат, а не двумя датами. (Отредактировано в ответ на комментарии)

Поэтому, если у вас есть 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;

}
0
ответ дан 3 December 2019 в 20:02
поделиться

Если я правильно понял ваш вопрос, вы спрашиваете о количестве дней, которые перекрывают два диапазона дат, например: Диапазон 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));
0
ответ дан 3 December 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: