C# 检查日期和时间段是否在一周内可用

C# 检查日期和时间段是否在一周内可用,c#,datetime,C#,Datetime,我有一个用户可以创建和添加规则的场景。此规则将分配给一周内的某个时间段执行。假设添加了第二条规则,则无法在第一条规则的时隙之间分配该规则 注意:我必须在一周内执行此操作,即周一到周日。不存在第二周。这一单周逻辑将在全年中每周运行 通过我的尝试,如果一条规则从周二运行到周五,我可以为另一条规则分配周一或周六到周日的时间段,但无法预订/分配周六到周一的时间段(即一周的起点) 以下是我迄今为止的尝试: foreach (var item in rules) { DateTime StartDa

我有一个用户可以创建和添加规则的场景。此规则将分配给一周内的某个时间段执行。假设添加了第二条规则,则无法在第一条规则的时隙之间分配该规则

注意:我必须在一周内执行此操作,即周一到周日。不存在第二周。这一单周逻辑将在全年中每周运行

通过我的尝试,如果一条规则从周二运行到周五,我可以为另一条规则分配周一或周六到周日的时间段,但无法预订/分配周六到周一的时间段(即一周的起点)

以下是我迄今为止的尝试:

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;
     }
 }
foreach(规则中的变量项)
{
DateTime StartDateWantBook=Convert.ToDateTime((DateTime.Today.Month+“/”+StartDay+“/”+DateTime.Today.Year)+“StartDayTime”);
DateTime EndDateWantBook=Convert.ToDateTime((DateTime.Today.Month+“/”+EndDay+“/”+DateTime.Today.Year)+“EndDay”);
DateTime StartDateDateReadyBooked=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.EndDay”);
//在同样的日子里,太阳和星期六
如果((EndDateAlreadyBooked-StartDateAlreadyBooked).TotalSeconds>=0)
{
如果((StartDateWantBook=EndDateAlreadyBooked)
||(EndDateWantBook=EndDateAlreadyBooked))
{
IsExist=假;
}
其他的
IsExist=真;
}
其他的
{ 
如果((StartDateWantBook=EndDateAlreadyBooked))
{
IsExist=假;
}
其他的
IsExist=真;
}
如果(IsExist==true)
{
打破
}
}
请有人建议应该编辑什么。。。或者用新的逻辑来做这件事

编辑:这是我的时隙是如何根据规则着色的..白色 空位空置

最新编辑:

在我的情况下,星期天=1,星期一=2….星期六=7。让我们喝一杯 场景,我预订了周日10:00到周日14:00。所以我的

现有开始日期:2015年1月7日上午10:00

现有截止日期:2015年1月7日下午2:00

现在,我正在预订另一个时间段,从周一上午10点到周日 下午6:00所以

请求开始日期:2015年2月7日上午10:00

请求日期:2015年1月7日下午6:00

在这种情况下,没有if()条件通过..上载了一个图像以供参考


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

假设这是您现有的时间段

         |-----------------|
以下请求将发生冲突

 (1)  |---------------|
 (2)  |------------------------ |
 (3)          |--------|
 (4)               |-----------| 
您可以为所有这些场景编写条件,但我认为可以归结为以下内容:

如果发生以下情况,则会发生冲突:

  • 请求预订的开始或结束数据在现有预订的开始和结束日期内。这包括场景1、3和4
  • 现有预订的开始或结束日期在请求预订的开始和结束日期期间。这包括场景2
所以你的逻辑应该是

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


似乎要检查两个时段之间的重叠。这很容易用一个:

bool overlaps=false;

如果((StartDateWantBook请在发布之前格式化您的代码-这会让人们更愿意花时间阅读您的问题。这是一个代码审查,应该在@ChrisMantle上处理。我下次发布内容时一定会处理它。谢谢您的编辑。@OrelEraki听起来太像是一个功能要求,我不想成为一个合适的人好了。如果它做了它应该做的事情,那么就检查它。不要更早。你能发布规则类或它的名称吗?谢谢你的帮助,我尝试一下。但它在我的情况下不起作用…你能看看我在问题中的最新编辑吗。你最近的编辑不起作用,因为你请求的日期范围是从2015年2月到2015年1月。这就是数据验证问题,而不是业务逻辑问题。方法的开始应检查请求的结束日期是否在请求的开始日期之后,如果没有,则引发异常。它是MM/DD/YYYY格式…将从7月2日到7月1日。我无法验证,因为用户可以自由选择和预订任何时间段(周日到周一)r星期一到星期天…为了实现这一点,我假设星期天为1,但在实际出发点上可以是任何东西…可能是我的假设方法完全错误…但我必须将其设置为按天而不是按日期…此时此刻,您是否有任何建议。请帮助…!!感谢您的答复…但将值替换为w我会把所有的事情都搞错…例如,如果用户从星期一预订到星期天…交换将从星期天预订到星期一,而不是预订整个星期,它将预订1天,但肯定用户从date1预订到date2,而不仅仅是选择天?我的意思是,您在这里使用的是“DateTime”变量不?谢谢您的技巧和简洁的解决方案…但在我的情况下,它不起作用…你能看看我最新的编辑。。。。
// 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");
bool overlaps = false;
if( (StartDateWantToBook <= EndDateAlreadyBooked ) && (StartDateAlreadyBooked <= EndDateWantToBook) )
  overlaps = true;