比较C#中范围之间的日期的简便方法

时间:2019-07-11 05:49:37

标签: 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

如您所见,我们还有可用时间:8AM - 12 AM2PM - 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;
        }

但是案例太多了。在上面的代码中,我正在检查request是否与reservation中的任何一个发生冲突。如果它与其中之一发生冲突,result = false就会删除request

我知道我可以在ClientSide中进行验证(例如在前端,仅发送良好的请求),但我想在后端进行逻辑验证request times

我的问题有图书馆或解决方案吗?

如您所见,当我们在要约租用时间中间进行预订时,首先我需要检查请求是否与第一个空闲要约时间匹配,然后我需要检查第二个空闲时间(如果request匹配offer时间免费)。也许您遇到类似的问题要解决?

编辑:

我在报价示例中添加了完整日期。我的Reservations系统可以在完整的DateTime上使用年,月,日等

1 个答案:

答案 0 :(得分:2)

检查范围是否重叠。

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