确定日历条目之间的空闲时间

时间:2015-12-03 12:36:13

标签: c# asp.net asp.net-mvc linq

我有一个系统,客户可以在一段时间内参与供应商的服务。

流程 客户将列出可用时间的时间范围(Start DateTime和End Datetime)。

供应商有一个日历,他们将在其中标记不可用的时间范围。这可能意味着当天将有多个日历条目。日历条目位于包含Start DateTime和End Datetime的表中。

我需要什么 当客户提交可用时间时,我需要系统获取供应商的所有日历条目列表。并确定所有条目之间是否有时间在上面列出的设定持续时间内。

示例 客户已提供可用时间 12/12/2016 7:00 am - 12/12/2016 7:00 pm

供应商具有以下日历条目 2016/12/12上午8:00 - 12/12/2016下午9:00 12/12/2016 12:00 pm - 12/12/2016下午2:00 12/12/2016下午5:00 - 12/12/2016下午7:00

我只需要知道供应商日历中是否至少有2小时免费。我不需要知道什么时候。我正在使用MVC 5和Linq查询

修改 添加了以下代码。目前仅测试客户可用开始时间与供应商日历条目开始时间之间是否存在“packageTime”差距,然后在日历条目和时间与客户可用的结束时间之间存在相同的“packageTime”差距。我不会考虑多个日历条目以及它们之间是否有空闲时间。我无法弄清楚实现这一目标的逻辑。

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

1 个答案:

答案 0 :(得分: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;
    }
}