从日期列表返回相交日期范围

时间:2017-07-18 06:31:28

标签: c# datetime date-range

我有一个Calendar对象列表,其中包含ParentId,StartDate和EndDate,它们代表工作班次的中断。任何时候都可能在一个区域内进行多次轮班,每次轮班都有不同的休息时间。

我需要能够获得它们相交的日期范围,以便我可以确定当前每个区域中没有任何人工作。

例如,如果我有以下班次休息时间:

new Calendar { ParentId = 1, StartDate = 2017-06-18 11:50:00, EndDate = 2017-06-18 12:20:00 };
new Calendar { ParentId = 2, StartDate = 2017-06-18 12:10:00, EndDate = 2017-06-18 12:40:00 };    
new Calendar { ParentId = 3, StartDate = 2017-06-18 12:15:00, EndDate = 2017-06-18 12:45:00 };

然后我需要返回的交叉时间是12:15:00 - 12:20:00,因为这是该区域没有人在场的唯一时间。

我尝试过.NET库的时间段,但这只能告诉我交叉点存在,而不是交叉点的范围。

为了清楚起见,我不想知道是否存在交叉点或重叠,我需要知道它们发生的范围。

enter image description here

1 个答案:

答案 0 :(得分:0)

这对我有用:

var cals = new []
{
    new { ParentId = 1, StartDate = DateTime.Parse("2017-06-18 11:50:00"), EndDate = DateTime.Parse("2017-06-18 12:20:00") },
    new { ParentId = 2, StartDate = DateTime.Parse("2017-06-18 12:10:00"), EndDate = DateTime.Parse("2017-06-18 12:40:00") },
    new { ParentId = 3, StartDate = DateTime.Parse("2017-06-18 12:15:00"), EndDate = DateTime.Parse("2017-06-18 12:45:00") },
};

var intersection =
    cals
        .Aggregate((c0, c1) => new
        {
            ParentId = -1,
            StartDate = c0.StartDate > c1.StartDate ? c0.StartDate : c1.StartDate,
            EndDate = c0.EndDate < c1.EndDate ? c0.EndDate : c1.EndDate
        });

它给了我:

intersection