2010-06-03 2 views

ответ

5

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

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

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

+0

Спасибо всем за ваши комментарии ... Отличные предложения! Я не понимал, что это так просто. – BoredOfBinary

0

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

Итак, если у вас есть 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

«Предположим, что T1 всегда

+0

Вы правы. Также я (и ответы выше) предполагают, что существует перекрытие. Мы должны проверить на это. – WombatPM

0

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

Вот пример из R. Это может прояснить ответ.

c_st = as.POSIXct("1996-10-14") 
c_ed = as.POSIXct("1996-10-19") 
d_st = as.POSIXct("1996-10-17") 
d_ed = as.POSIXct("1999-10-22") 

max(range(c_st,c_ed))-min(range(d_st,d_ed)) >= 0 & min(range(c_st,c_ed)) < max(range(d_st,d_ed)) 

Правда указывает, что они пересекаются, False в противном случае. [r]

8

Вот небольшой метод, который я написал, чтобы рассчитать это.

private static int inclusiveDays(DateTime s1, DateTime e1, DateTime s2, DateTime e2) 
{ 
    // If they don't intersect return 0. 
    if (!(s1 <= e2 && e1 >= s2)) 
    { 
     return 0; 
    } 

    // Take the highest start date and the lowest end date. 
    DateTime start = s1 > s2 ? s1 : s2; 
    DateTime end = e1 > e2 ? e2 : e1; 

    // Add one to the time range since its inclusive. 
    return (int)(end - start).TotalDays + 1; 
} 
+0

Отличное, прямое решение. Работает для меня и проходит все мои тесты. –

Смежные вопросы