确定两个日期范围是否重叠,如果是,我如何获得新的开始和结束时间的重叠时间

时间:2016-06-08 07:02:32

标签: c# jquery datetime

我正在使用jquery完整日历来显示事件。它的工作正常,但我有一个场景,我必须通过减去他的繁忙时间来显示人的可用性。

所以我有两种类型的事件,包括开始和结束日期 1.人们忙碌的时间事件 2.人可用时间事件

示例:如果有人在上午9点至下午5点可用,但他正忙于上午11点至下午3点。现在重叠是从上午11点到下午3点发生的,现在我想分开它应该通过减去他可用时间的繁忙时间给我两个新事件。它将在早上9点至11点之间返回两个新事件,第二个从下午3点至下午5点返回。我如何得到这个

public bool Intersects(DateTime r1start, DateTime r1end, DateTime r2start, DateTime r2end)
    {
        return (r1start == r2start) || (r1start > r2start ? r1start <= r2end : r2start <= r1end);
    }

现在我可以在发生重叠时获得重叠,但现在我想分割重叠并创建包含开始和结束时间的新事件。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用DateRange的此实现:

public class DateRange : IEquatable<DateRange>
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }

    public DateRange Intersect(DateRange d)
    {
        var s = (d.Start > this.Start) ? d.Start : this.Start; // Later Start
        var e = (d.End < this.End) ? d.End : this.End; // Earlier ending

        if (s < e)
            return new DateRange() { Start = s, End = e };
        else
            return null;
    }

    public bool Contains(DateTime d)
    {
        return d >= Start && d <= End;
    }

    public bool Equals(DateRange obj)
    {
        return Start.Equals(obj.Start) && End.Equals(obj.End);
    }
}

编辑

var d1 =new DateRange() { Start = DateTime.Now, End = DateTime.Now.AddDays(1) };
var d2 =new DateRange() { Start = DateTime.Now.AddDays(-1), End = DateTime.Now };

Console.WriteLine(d1.Intersect(d2));

<强> EDIT2

    public List<DateRange> Intersect2(DateRange d)
    {
        var s = (d.Start > this.Start) ? d.Start : this.Start; // Later Start
        var e = (d.End < this.End) ? d.End : this.End; // Earlier ending

        if (s < e)
            return new List<DateRange>()
            {
                new DateRange() { Start = new DateTime(Math.Min(Start.Ticks, d.Start.Ticks)), End = s },
                new DateRange() { Start = e, End = new DateTime(Math.Max(End.Ticks, d.End.Ticks)) }
            };
        else
            return null;
    }

答案 1 :(得分:0)

在你的上一个陈述中你有一个错误:在所有情况下都出现r2start == r1end。 也许:

  1. r1start&lt; r2end:r2start&lt; = r1end
  2. r1start&lt; = r2end:r2start&lt; r1end ?
  3. 我解决了这个问题:

    return r1Start <= r2Start && r1End >= r2Start ||
            r1Start <= r2Start && r1End >= r2End ||
            r1Start >= r2Start && r1Start < r2Start && r1End <= r2End ||
            r1Start >= r2Start && r1Start <= r2End && r1End <= r2End ||
            r1Start <= r2Start && r1End > r2Start ||
            r1Start >= r2Start && r1Start <= r2End && r1End > r2End;
    

答案 2 :(得分:0)

这将返回空闲时间

public class DateSpan
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public bool Contains(DateSpan ds)
    {
        return ds.Start >= Start && ds.End <= End ;
    }
    public bool IsHitTo( DateTime i)
    {
        return i>= Start && i<= End ;
    }
    public List<DateSpan> GetFreeTime( DateSpan i)
    {
        List<DateSpan> ld = new  List<DateSpan> ();
        if( IsHitTo( i.Start))
        {
            ld.Add(new DateSpan(){ Start = this.Start, End = I.End});
            if( IsHitTo( i.End))
            {
                 ld.Add(new DateSpan(){ Start = i.Start, End = i.Start});
            }
        }
        else
        {
             if( IsHitTo( i.Start))
            {
                 ld.Add(new DateSpan(){ Start = i.End, End = this.End});
            }
            else
            {
                 if(i.Contains(this))
                {
                     return new  List<DateSpan> ();
                }
                else
                {
                     ld.Add(this);
                }
            }
        }
        return ld;
   }
}

并像这样使用

List<DateSpan> l =  FreeTime.GetFreeTime(BusyTime);