2015-12-03 67 views
1

我有一個系統,客戶可以在設定的時間內使用供應商的服務。確定日曆條目之間的空閒時間

過程 客戶將列出可用時(開始日期時間和結束日期時間),他們的時間框架。

供應商有一個日曆,他們將標記它們不可用的時間範圍。這可能意味着當天會有多個日曆條目。日曆條目位於包含「開始日期時間」和「結束日期時間」的表格中。

我需要 什麼當客戶提交他們的可用時間,我需要的系統,以獲得所有供應商的日曆條目列表。並確定它們的所有條目之間是否存在上述列出的時間。

客戶已提供的可用時間 2016年12月12日上午7:00 - 2016年12月12日下午7:00

供應商有以下日曆項 2016年12月12日8 :00am - 12/12/2016 9:00 pm 2016-12-12 12:00 pm - 12/12/2016 2:00 pm 12/12/2016 5:00 pm - 12/12/2016 7:00 pm

我只需要知道供應商日曆中是否至少有2小時免費。我不需要知道什麼時候。我正在使用MVC 5和Linq查詢

編輯 添加了以下代碼。當前僅測試查看客戶可用開始時間和供應商日曆條目開始時間之間是否存在「packageTime」間隔,然後是日曆條目和時間與客戶可用結束時間之間是否存在相同的「packageTime」間隔。 Id不會考慮多個日曆條目,並且它們之間有空閒時間。我無法制定出實現這一目標的邏輯。

List<Calendar> calendar = db.Calendar.Where(m => m.PhotographersId == item.PhotographersId && m.StartTime.Date == bookings.AvailableDate1Start.Date).OrderBy(m => m.StartTime).ToList(); 

bool date1Free = false; 

foreach (var calendarItem in calendar) 
{ 
    DateTime calendarPackageStart, calendarPackageEnd; 
    calendarPackageStart = calendarItem.StartTime.AddHours(packageTime * -1); 
    calendarPackageEnd = calendarItem.EndTime.AddHours(packageTime); 

    if (calendarItem.StartTime.Date == bookings.AvailableDate1Start.Date && !date1Free) 
    { 
     if (bookings.AvailableDate1Start <= calendarPackageStart) 
     { 
      date1Free = true; 
     } 
     else if (bookings.AvailableDate1End >= calendarPackageEnd) 
     { 
      date1Free = true; 
     } 
    } 
} 
+0

你的例子是一個有點令人困惑的先生,根據你的例子,你會得到什麼樣的結果? –

+0

對不起。我編輯了代碼來消除一些臃腫,這不是特定於該問題,並更新了編輯部分,以解釋我究竟是在 – Andrew

+0

@Andrew也許這將有助於:https://msdn.microsoft.com /en-us/library/8ysw4sby(v=vs.110).aspx – Yoda

回答

1

使用@yoda提供的日期減去鏈接我能夠來到以下解決方案。循環遍歷供應商日曆上的所有日期,並檢查客戶提供的日期之間是否有(x)個小時。

bool isFree = false; 
List<Calendar> calendarItems = calendar.Where(m => m.Id == Supplier.Id && m.StartTime.Date == customerAvailableStart.Date).OrderBy(m => m.StartTime).ToList(); 
if (calendarItems .Count > 0) 
{ 
    DateTime date1, date2; 
    date1 = customerAvailableStart; 

    for (var i = 0; i <= calendarItems .Count; i++) 
    { 
     if (i != calendarItems .Count) 
     { 
      date2 = calendarItems [i].StartTime; 
     } 
     else 
     { 
      date2 = customerAvailableEnd; 
     } 

     if (date2.Subtract(date1).TotalHours >= packageTime) 
     { 
      isFree = true; 
      break; 
     } 
     date1 = calendarItems [i].EndTime; 
    } 
}