如何获得2个范围之间的重叠天数?

Dar*_*dar 5 c# date range

让我先解释一下情况 - 假设我有4个日期:BS,BE,PS,PE(S表示开始,E表示结束).我需要知道在给定这些日期时有多少天过度研磨.例如:BE-05.01,BS-10.01,PS-03.01,PE-07.01结果为:3(05.01,06.01和07.01重叠)

我写了下面的代码,但它似乎很乱,我想检查是否有更简单的方法来做到这一点:

private static double GetNumOfOverLappingDays(DateTime BS, DateTime BE, DateTime PS, DateTime PE)
    {
        //case 1:
        //                  |--- B ---|
        //                  |----P ---|

        //case 2:
        //                  |--- B ---|
        //                          | --- P --- |

        //case 3:
        //                  |--- B ---|
        //          | --- P ---- |

        //case 4:
        //                  |--- B ---|
        //                     | - P - |

        //case 5:
        //                  |--- B ---|
        //              | -------- P -------- |

        double days = -1;
        bool isNotOverLap = (BS > PE) || (PS > BE);

        if (isNotOverLap == false)
        {
            //case 1
            if (BS == PS && BS == PE)
            {
                days = (PE - PS).TotalDays;
            }
            //case 2
            else if (BE > PS && BE < PE)
            {
                days = (BE - PS).TotalDays;
            }
            //case 3
            else if (BS > PS && BS < PE)
            {
                days = (PE - BS).TotalDays;
            }
            //case 4
            else if (BS < PS && BE > PE)
            {
                days = (PE - PS).TotalDays;
            }
            //case 5
            else if (BS > PS && BE < PE)
            {
                days = (BE - PS).TotalDays;
            }
        }
        return days+1;
    }
Run Code Online (Sandbox Code Playgroud)

提前感谢任何帮助,

阿米特

Bol*_*glu 9

试试这个:

    private static double GetOverlappingDays(DateTime firstStart, DateTime firstEnd, DateTime secondStart, DateTime secondEnd)
    {
        DateTime maxStart = firstStart > secondStart ? firstStart : secondStart;
        DateTime minEnd = firstEnd < secondEnd ? firstEnd : secondEnd;
        TimeSpan interval = minEnd - maxStart;
        double returnValue = interval > TimeSpan.FromSeconds(0) ? interval.TotalDays : 0;
        return returnValue;
    }
Run Code Online (Sandbox Code Playgroud)


Ton*_*ony 1

尝试使用for循环:

DateTime d1 = new DateTime(2013,12,1),
            d2 = new DateTime(2013,12,14),
            d3 = new DateTime(2013,12,10),
            d4 = new DateTime(2013,12,20);
int count = 0;

for (var d = d1.Date; d <= d2.Date; d = d.AddDays(1))
{
      if (d >= d3.Date && d <= d4.Date)
           count++;
}

Console.WriteLine(count);
Run Code Online (Sandbox Code Playgroud)

请注意,此代码给出了整数值。如果您需要以小时为单位的价值,则此代码不适合。此外,这不是最有效的方法,但它很简单并且适用于小范围。