c#中的Timespan交叉点

时间:2011-07-26 23:06:18

标签: c# .net timespan

假设我有2个日期范围。

这些日期范围可以表示为时间跨度。

我想找到一个日期范围,该范围在两个时间范围内。

Range 1: 2/1/2011 - 8/1/2011 (timespan of 6 months)
Range 2: 5/2/2011 - 5/28/2011 (timespan of 26 days)

所以在这种情况下,交叉点将是5/2 / 2011-5 / 28/2011,但是范围可以向任一方向移动(或者根本不相交,在这种情况下我希望得到的时间跨度为是0长度)

最后,我需要生成的交叉时间跨度的开始/结束的日历日期(不仅仅是滴答/小时/天等)

在c#3.0中有一种优雅的方法吗?

更新

我使用了StriplingWarriors代码并创建了一个方法..

    private static DateRange GetIntersectionRange(DateRange range1, DateRange range2) {
        var iRange = new DateRange();
        iRange.From = range1.From < range2.From ? range2.From : range1.From;
        iRange.To = range1.To < range2.To ? range1.To : range2.To;
        if (iRange.From > iRange.To) iRange = null;
        return iRange;
    }

2 个答案:

答案 0 :(得分:11)

也许是这样的事情?

var range1 = new{start = DateTime.Parse("2/1/2011"), end = DateTime.Parse("8/1/2011")};
var range2 = new{start = DateTime.Parse("5/2/2011"), end = DateTime.Parse("5/28/2011")};
var iStart = range1.start < range2.start ? range2.start : range1.start;
var iEnd = range1.end < range2.end ? range1.end : range2.end;
var newRange = iStart < iEnd ? new{start = iStart, end = iEnd} : null;

如果没有相交的时间段,则应返回null

答案 1 :(得分:0)

简单的方法是从范围2的开始时间中扣除范围1的开始时间。如果时间跨度> 0然后选择范围1开始作为开始日期。

对范围的结束日期执行相同操作。但是如果时间跨度是> 0然后选择范围2的结束日期。

然后比较结果,如果两者都是有效范围。即开始&lt;结束。否则没有有效范围。