如何查找日期范围之间的匹配时间

问题描述

我正在做一个约会查找器,它可以查看人们的日历并搜索会议的可用时间。它工作得很好。但是,我想排除对中断时间的查找,中断时间是两个DateTime之间的Daterange,两者都以1/1/1作为年份(作为占位符),并包括后面的时间。我要遍历一个工作日的每一分钟,并且一个函数应该确定当前时间是否在休息时间Daterange中。

我有一个带有自定义Daterange类的列表:

private static List<Daterange> _breakTimes = new List<Daterange>() {
        new Daterange(new DateTime(1,1,10,0),new DateTime(1,30,0)),new Daterange(new DateTime(1,13,14,0))
};

这是遍历所有工作日的函数(我已经注释了check函数应该去的那一行):

foreach (var date in GetWorkingDays(startDate,endDate))
        {
            for (int hour = 0; hour <= 24; hour++)
            {
                if (hour < startingHour || hour >= endingHour) continue;

                for (int minute = 0; minute < 60; minute++)
                {
                    var currentDate = new DateTime(date.Year,date.Month,date.Day,hour,minute,0);

                    bool shouldContinue = false;

                    foreach (var breakTime in _breakTimes)
                    {
                        // Here it should look wheter the current time is in the break times:

                        if ((currentDate.Hour >= breakTime.StartDate.Hour && currentDate.Hour <= breakTime.EndDate.Hour) && (currentDate.Minute > breakTime.StartDate.Minute && currentDate.Minute <= breakTime.EndDate.Minute))
                        {
                            shouldContinue = true;
                            break;
                        }
                    }

                    if (shouldContinue) continue;

                    if (minute == 59)
                    {
                        _workingDaysWithHours.Add(new Daterange(new DateTime(date.Year,new DateTime(date.Year,hour + 1,0)));
                        continue;
                    }

                    _workingDaysWithHours.Add(new Daterange(new DateTime(date.Year,minute + 1,0)));
                }
            }
        }

所以我只需要知道如何检查当前时间是否在休息时间之间即可。 希望这是可以理解的。

解决方法

您可以在此示例中修改代码以获取所需的内容Algorithm to detect overlapping periods

foreach (var date in new [] { DateTime.Now })
{
    for (int hour = 0; hour <= 24; hour++)
    {
        if (hour < startingHour || hour >= endingHour) continue;

        for (int minute = 0; minute < 60; minute++)
        {
            var currentDate = new DateTime(date.Year,date.Month,date.Day,hour,minute,0);

            bool shouldContinue = false;

            var currentTime = new DateTime(1,1,0);

            foreach (var breakTime in _breakTimes)
            {

                var isInBreak = breakTime.StartDate <= currentTime && currentTime < breakTime.EndDate;

                if (isInBreak)
                {
                    shouldContinue = true;
                    break;
                }
            }

            if (shouldContinue) continue;

            if (minute == 59)
            {
                _workingDaysWithHours.Add(new DateRange(new DateTime(date.Year,0),new DateTime(date.Year,hour + 1,0)));
                continue;
            }

            _workingDaysWithHours.Add(new DateRange(new DateTime(date.Year,minute + 1,0)));
        }
    }
}
,

我通过使用带有元组的列表来解决它,并分别添加分钟数:

private static List<Tuple<TimeSpan,int>> _breakTimes = new List<Tuple<TimeSpan,int>>()
        {
            new Tuple<TimeSpan,int>(new TimeSpan(10,30),new Tuple<TimeSpan,int>(new TimeSpan(13,30,30)
        };

这是查看是否是休息时间的函数:

foreach (var breakTime in _breakTimes)
                        {
                            if (currentTime >= breakTime.Item1 && currentTime < breakTime.Item1.Add(new TimeSpan(0,breakTime.Item2,0)))
                            {
                                shouldContinue = true;
                                break;
                            }
                        }