【问题标题】:Timespan intersection in c#c#中的时间跨度交叉点
【发布时间】:2011-07-26 23:06:17
【问题描述】:

假设我有 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;
    }

【问题讨论】:

  • 您需要知道范围的开始日期/结束日期,还是只知道它的长度?

标签: c# .net timespan


【解决方案1】:

大概是这样的吧?

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

【讨论】:

    【解决方案2】:

    简单的方法是用范围2的开始时间减去范围1的开始时间。如果时间跨度> 0,则选择范围1开始作为开始日期。

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

    如果两者都是有效范围,则比较结果。即开始

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多