C# 两个日期范围相交的天数计数

C# 两个日期范围相交的天数计数,c#,asp.net,C#,Asp.net,有人知道如何最好地计算两个日期范围之间相交的天数吗?获取一个新范围,该范围由开始时间的较晚者和结束时间的较早者定义,并确定新范围内每天从纪元开始算起的天数 区别在于交叉口的天数。只接受正值 编辑以考虑范围而不是单个日期。该问题询问的是两个日期范围,而不是两个日期。(根据评论编辑) 因此,如果您有两个日期范围(r1s、r1e),则需要确定哪个日期范围首先开始,是否存在重叠,以及重叠的内容 double overlap(DateTime r1s, DateTime r1e, DateTime r2s

有人知道如何最好地计算两个日期范围之间相交的天数吗?

获取一个新范围,该范围由开始时间的较晚者和结束时间的较早者定义,并确定新范围内每天从纪元开始算起的天数

区别在于交叉口的天数。只接受正值


编辑以考虑范围而不是单个日期。

该问题询问的是两个日期范围,而不是两个日期。(根据评论编辑)

因此,如果您有两个日期范围(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;

}
双重重叠(日期时间r1s、日期时间r1e、日期时间r2s、日期时间r1e){
日期时间t1s,t1e,t2s,t2e;

如果(rs1如果我理解你的问题,你问的是两个日期范围重叠的天数,例如: 范围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));

下面是一个来自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) )
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))
True表示它们相交,否则为False。
[r] 我写了一个小方法来计算这个

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;
}
private static int inclusiveDays(日期时间s1、日期时间e1、日期时间s2、日期时间e2)
{
//如果它们不相交,则返回0。
如果(!(s1=s2))
{
返回0;
}
//取最高开始日期和最低结束日期。
DateTime start=s1>s2?s1:s2;
DateTime end=e1>e2?e2:e1;
//将一个添加到时间范围,因为它包含一个时间范围。
返回(整数)(结束-开始)。总天数+1;
}

“假设T1s总是