【问题标题】:Count of days intersecting between two date ranges两个日期范围之间相交的天数
【发布时间】:2012-08-30 05:30:35
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

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

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

    【讨论】:

    • 很好,直接的解决方案。为我工作并通过了我所有的测试。
    • 这个答案可以帮助我解决所有关于交叉点日期时间的问题。我使用这个答案来计算两个日期时间范围之间的交集。
    【解决方案2】:

    获得一个新范围,由较晚的开始和较早的结束定义,并确定该新范围内每一天从纪元开始以来的天数。

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

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

    【讨论】:

    • 谢谢大家的cmets...很好的建议!没想到这么简单。
    【解决方案3】:

    这是来自 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]

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        问题是在两个日期范围而不是两个日期之间提问。 (根据 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;
        
        }
        

        【讨论】:

        • "假设 T1s 总是
        • 你是对的。我(以及上面的答案)也假设存在重叠。我们也需要对此进行测试。
        猜你喜欢
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多