检查一周内是否有可用的日期时间段

时间:2015-07-08 09:00:41

标签: c# datetime

我有一个用户可以创建和添加规则的场景。此规则将分配到一周中的某个时间段以供执行。假设添加了第二个规则,则不能在第一个规则的时隙之间分配。

注意:我必须实施一周,即周一至周日。没有第二周存在。这一周的逻辑将在全年每周运行。

如果一条规则从星期二到星期五运行,我可以将星期一或星期六到星期日的时间段分配给另一条规则,但是不能预定/指定星期六到星期一的时间段(即,本周的起点。)

以下是我到目前为止的尝试:

foreach (var item in rules)
{
    DateTime StartDateWantToBook = Convert.ToDateTime((DateTime.Today.Month + "/" + StartDay + "/" + DateTime.Today.Year) + " " + StartDayTime);
    DateTime EndDateWantToBook = Convert.ToDateTime((DateTime.Today.Month + "/" + EndDay + "/" + DateTime.Today.Year) + " " + EndDayTime);
    DateTime StartDateAlreadyBooked = Convert.ToDateTime((DateTime.Today.Month + "/" + item.StartDay + "/" + DateTime.Today.Year) + " " + item.StartDayTime);
    DateTime EndDateAlreadyBooked = Convert.ToDateTime((DateTime.Today.Month + "/" + item.EndDay + "/" + DateTime.Today.Year) + " " + item.EndDayTime);

    //For same days and sun-sat days
    if ((EndDateAlreadyBooked - StartDateAlreadyBooked).TotalSeconds >= 0)
    {
        if ((StartDateWantToBook <= StartDateAlreadyBooked && EndDateWantToBook <= StartDateAlreadyBooked) || (StartDateWantToBook >= EndDateAlreadyBooked && EndDateWantToBook >= EndDateAlreadyBooked)
            || (EndDateWantToBook <= StartDateAlreadyBooked && StartDateWantToBook >= EndDateAlreadyBooked))
        {
            IsExist = false;
        }
        else
            IsExist = true;
    }
    else
    { 
         if ((StartDateWantToBook <= StartDateAlreadyBooked && EndDateWantToBook <= StartDateAlreadyBooked) && (StartDateWantToBook >= EndDateAlreadyBooked && EndDateWantToBook >= EndDateAlreadyBooked))
         {
             IsExist = false;
         }
         else
             IsExist = true;
     }

     if (IsExist == true)
     {
         break;
     }
 }

请有人建议应该编辑什么...或者做到这一点的新逻辑...

  

编辑:这是我的时段根据规则着色的方式。白色   空间无人居住。

Rule Template View

最新编辑:

  

在我的情况下,我服用星期日= 1,星期一= 2 .....星期六= 7。让我们来吧   情景,我在周日10:00到周日14:00预订。所以我的

     

ExistingStartDate:2015年7月1日上午10:00

     

ExistingEndDate:7/1/2015 02:00 pm

     

现在,我预订从星期一上午10点到星期日的另一个时段   06:00 pm所以,

     

RequestedStartDate:2015年7月2日上午10:00

     

RequestedEndDate:7/1/2015 06:00 pm。

     

在这种情况下,没有if()条件传递..上传图像以供参考..

2 个答案:

答案 0 :(得分:2)

根据您的描述,我的理解是,插槽中的任何部分重叠都足以阻止创建新记录。

假设这是您现有的时段

         |-----------------|

以下请求会发生冲突

 (1)  |---------------|
 (2)  |------------------------ |
 (3)          |--------|
 (4)               |-----------| 

你可以为所有这些场景编写条件,但我认为可以归结为以下几点:

如果

发生冲突
  • 所请求预订的开始或结束数据属于现有预订的开始和结束日期。这包括方案1,3和4
  • 现有预订的开始或结束日期在请求预订的开始和结束日期之前。这包括方案2。

所以你的逻辑就像......

if((StartDateWantToBook < EndDateAlreadyBooked) && (StartDateAlreadyBooked < EndDateWantToBook))

最后一点:您的变量名称非常相似 - RequestedStartRequestedEndExistingStartExistingEnd等变量名称将使您的代码更具可读性和可维护性。

修改:如果您无法在结束日期之后选择的开始日期,则可以执行以下操作之一...

// Throw an exception....
if (StartDateWantToBook > EndDateWantToBook)
  throw new Exception("Start Date must occur before End Date");

...或

// Correct the user's selection by swapping the values...
if (StartDateWantToBook > EndDateWantToBook)
{  
    DateTime temp = StartDateWantToBook ;
    StartDateWantToBook = EndDateWantToBook;
    EndDateWantToBook = temp;
}

  throw new Exception("Start Date must occur before End Date");

答案 1 :(得分:1)

好像你想检查两个时期之间的重叠。使用"cross check"

轻松完成
bool overlaps = false;
if( (StartDateWantToBook <= EndDateAlreadyBooked ) && (StartDateAlreadyBooked <= EndDateWantToBook) )
  overlaps = true;