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总是