2016-06-08 52 views
1

我正在使用jquery完整日曆來顯示事件。它工作正常,但我有一個場景,我必須通過減去忙碌的時間來顯示人的可用性。確定是否兩個日期範圍重疊,如果是的話我如何獲得與新的開始和結束時間的重疊時間

所以我有兩個類型有開始和結束日期 1人忙的時候事件 2人可用時間事件

例的事件:如果一個人可用9點至晚5,但他忙11:00 -3pm。現在重疊發生在上午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); 
    } 

現在,當我能夠得到,如果發生重疊,但現在我想拆分重疊和創建開始和結束時間的新事件。

任何幫助,將不勝感激。

回答

1

您可以使用此執行日期範圍的:

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; 
    } 
+0

感謝您的回覆,但我有兩個日期範圍不是一個。在上面的例子中 – mukeshsalaria01

+0

我編輯了我的答案,以顯示如何使用它;) –

+0

感謝它返回重疊的開始和結束時間,真棒,但最後一件事情,如果你會幫我。我實際上需要開始和結束時間不重疊的時期。如果中間有重疊,那麼它應該返回兩個事件開始和結束時間。一個在重疊之前,一個在重疊之後。 – mukeshsalaria01

0

在上次聲明中,您有一個錯誤:在所有情況下都存在r2start == r1end。 可能:

  1. r1start < r2end:r2start < = r1end
  2. r1start < = r2end:r2start < r1end ?

我解決這個問題的條件:

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; 
+0

這個邏輯是好的,我已經或條件不和。它會工作。我主要關心的是當我發生重疊時,我如何獲得重疊時間的開始和結束時間。 – mukeshsalaria01

+0

這種情況確實涵蓋了所有相交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); 
+0

FreeTime.GetFreeTime(BusyTime)沒有得到FreeTime它代表什麼? – mukeshsalaria01

+0

我會** ** DateSpan **的列表,每個'DateSpan'都有'Start'和'End'。我用手機寫了它,我沒有測試它,所以我會測試它,如果它有任何錯誤,我會編輯我的答案。我認爲它會返回正確的。 – mohsen

相關問題