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