我有一个用户可以创建和添加规则的场景。此规则将分配到一周中的某个时间段以供执行。假设添加了第二个规则,则不能在第一个规则的时隙之间分配。
注意:我必须实施一周,即周一至周日。没有第二周存在。这一周的逻辑将在全年每周运行。
如果一条规则从星期二到星期五运行,我可以将星期一或星期六到星期日的时间段分配给另一条规则,但是不能预定/指定星期六到星期一的时间段(即,本周的起点。)
以下是我到目前为止的尝试:
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;
}
}
请有人建议应该编辑什么...或者做到这一点的新逻辑...
编辑:这是我的时段根据规则着色的方式。白色 空间无人居住。
最新编辑:
在我的情况下,我服用星期日= 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()条件传递..上传图像以供参考..
答案 0 :(得分:2)
根据您的描述,我的理解是,插槽中的任何部分重叠都足以阻止创建新记录。
假设这是您现有的时段
|-----------------|
以下请求会发生冲突
(1) |---------------|
(2) |------------------------ |
(3) |--------|
(4) |-----------|
你可以为所有这些场景编写条件,但我认为可以归结为以下几点:
如果
发生冲突所以你的逻辑就像......
if((StartDateWantToBook < EndDateAlreadyBooked) && (StartDateAlreadyBooked < EndDateWantToBook))
最后一点:您的变量名称非常相似 - RequestedStart
,RequestedEnd
,ExistingStart
和ExistingEnd
等变量名称将使您的代码更具可读性和可维护性。
修改:如果您无法在结束日期之后选择的开始日期,则可以执行以下操作之一...
// 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;