【发布时间】:2012-08-30 05:30:35
【问题描述】:
有人知道如何最好地计算两个日期范围之间相交的天数吗?
【问题讨论】:
有人知道如何最好地计算两个日期范围之间相交的天数吗?
【问题讨论】:
这是我写的一个小方法来计算这个。
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;
}
【讨论】:
获得一个新范围,由较晚的开始和较早的结束定义,并确定该新范围内每一天从纪元开始以来的天数。
区别在于路口的天数。只接受正值。
编辑考虑范围而不是单个日期。
【讨论】:
这是来自 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]
【讨论】:
如果我理解您的问题,您是在询问两个日期范围重叠的天数,例如: 范围 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));
【讨论】:
问题是在两个日期范围而不是两个日期之间提问。 (根据 cmets 编辑)
所以如果你有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;
}
【讨论】: