C# 在C语言中比较日期范围的简单方法#

C# 在C语言中比较日期范围的简单方法#,c#,C#,我正在预订系统 例如,我可以随时预订以下优惠: Offer: 8AM - 8PM (in one day, for example in 1/12/2018) OR Offer: 7/12/2019 8AM - 10/12-2019 8PM 有人保留部分时间,例如: First reservation: 12AM - 2PM (same day as offer) OR First reservation: 7/12/2019 8AM - 8/12/2019 8AM 如您所见,我们还有可用时

我正在预订系统

例如,我可以随时预订以下优惠:

Offer: 8AM - 8PM (in one day, for example in 1/12/2018)
OR
Offer: 7/12/2019 8AM - 10/12-2019 8PM
有人保留部分时间,例如:

First reservation: 12AM - 2PM (same day as offer)
OR
First reservation: 7/12/2019 8AM - 8/12/2019 8AM
如您所见,我们还有可用时间:
8AM-12am
2PM-8PM

现在,有人想预留时间:

Second reservation: 8AM - 10AM (same day as offer)
OR 
Second reservation: 10/12/2019 0AM - 10/12/2019 8PM
然后,有人想再预订一次:

Third reservation: 2PM - 8PM (same day as offer)
OR
Third reservation: 8/12/2019 0AM - 9/12/2019 8AM
从上面的场景来看,报价中的可用时间:

Available time in offer (after 3 reservations): 10AM - 12AM (same day as offer)

//i didnt write example with couple of days because it is too hard to calculate it in mind
现在,我的问题。我正在寻找一种解决方案,用
DateTimes
验证介于某个时间段之间的请求

我开始编写代码:

        //there is no Offer offer in this method, because i check request times
        //with offer step before
        private bool TimeOfReservationIsValid(Command request)
        {
            bool result = true;

            var reservations = _context.Reservations.Where(r => r.OfferId == request.OfferId);

            if (reservations.Count() > 0)
            {
                foreach (var reservation in reservations)
                {
                    if (request.StartOfRent <= reservation.StartOfRent
                        && request.StartOfRent < reservation.EndOfRent
                        && request.EndOfRent <= reservation.EndOfRent
                        && request.EndOfRent > reservation.StartOfRent)
                    {
                        break;
                    }
                    else if (request.StartOfRent >= reservation.StartOfRent
                        && request.StartOfRent < reservation.EndOfRent
                        && request....)
                    {
                        //i think in this code it can be too much if statemantes?
                    }
                }
            }

            return result;
        }
//此方法中没有提供,因为我检查了请求时间
//在报价前一步
私有bool TimeOfReservationIsValid(命令请求)
{
布尔结果=真;
var reservations=_context.reservations.Where(r=>r.OfferId==request.OfferId);
if(reservations.Count()>0)
{
foreach(保留中的var保留)
{
如果(request.startofort=reservation.startofort
&&request.startofren
但案例太多了。在上面的代码中,我正在检查
请求
是否与任何
保留
冲突。如果它与其中一个冲突,
result=false
,我将删除
request

我知道我可以在
ClientSide
中进行验证(例如,在前端,只发送好的请求),但我想在后端对该
请求时间进行逻辑验证

我的问题有什么解决方案吗

如您所见,当我们在租房时间中间进行预订时,首先我需要检查请求是否与第一个免费提供时间匹配,然后我需要检查第二个免费提供时间(如果
请求
与免费
提供
时间匹配)。也许你在和我一样的问题上挣扎

编辑:


我在我的报价示例中添加了完整日期。我的
预订
系统使用完整的
日期时间
,包括年、月、日等

检查是否有任何范围重叠

   var overlaps =
       _context.Reservations
          .Where(r => r.OfferId == request.OfferId)
          .Any(r => request.EndOfRent >= reservation.StartOfRent && 
                    reservation.EndOfRent >= request.StartOfRent)

有很多方法可以帮助您。@mj将其时间与
日期(年、月、日等,我需要它,因为我的系统也提供以天为单位的时间)。在代码中,它是简单的
public DateTime startofren{get;set}
,我对此不做任何处理。@mjwills是的,如果在
Offer
中可用,您可以预订一两天,所以您想检查请求中的时段是否与预订集合中的任何时段相交?我将使用。所以我可以简化逻辑。