两个日期范围之间相交的天数

时间:2010-06-03 22:41:24

标签: c# asp.net

有人会对如何最好地计算两个日期范围之间相交的天数有任何想法吗?

5 个答案:

答案 0 :(得分:13)

这是我写的一个小方法来计算它。

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;
}

答案 1 :(得分:5)

获取一个新的范围,由开头的后期和结尾的早期定义,并确定自该新范围内每天的纪元开始以来的天数。

差异是交叉路口的天数。只接受正值。

编辑以考虑范围而非个别日期。

答案 2 :(得分: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) )

True表示它们相交,否则为False。 [r]

答案 3 :(得分: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;

}

答案 4 :(得分: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));