问题: 我正在为学校的顾问实施调度程序。调度程序假设在星期一到星期五的上午8:00到下午5:00之间设置15分钟的间隔时间段。此外,顾问程序必须指定调度程序的开始和结束日期。调度程序还将提供一个选项,以指定15分钟时隙是否未打开。这意味着我的顾问将能够将特定时间段标记为不可用。
到目前为止我有什么: 我创建了一个简单的类:
public class TimeSlot
{
public DateTime dateTime
{
get;
set;
}
public bool isAvailable
{
get;
set;
}
TimeSlot(DateTime dt, bool Avalible)
{
dateTime = dt;
isAvailable = Avalible;
}
}
该类基本上代表调度程序中一个时隙的对象。我还有一个时间列表列表,其中列出了有效时段:
List<TimeSlot> TSList = new List<TimeSlot>();
请注意,有效的时间段表示以下内容:
另外,我有一个方法填写TSList如下:
private void button_Next_Click(object sender, RoutedEventArgs e)
{
/* Getting the values of fromDate and toDate from the GUI controls*/
DateTime fromDate = datePicker1.SelectedDate.Value;
DateTime toDate = datePicker2.SelectedDate.Value;
while (fromDate <= toDate)
{
/*This ensures that we only deal with days Monday to Friday*/
if (fromDate.DayOfWeek.ToString() != "Saturday" && fromDate.DayOfWeek.ToString() != "Sunday")
{
/*PROBLEM HERE!!*/
}
/*Updating fromDate: Incrementing fromDate by 1 day*/
fromDate = fromDate.AddDays(1);
}
}
请注意,我只能满足有效时段条件中的第一个条件。因此,我只能将日期限制在星期一到星期五的范围内。
问题: 我试图在一个时间段内实现缺少的两个有效条件:
答案 0 :(得分:3)
首先,请使用DayOfWeek.Saturday
和DayOfWeek.Sunday
进行比较,不需要转换为字符串...
然后只使用像
这样的简单循环DateTime startSlot = fromDate.Date.AddHours(8); // Starts at 8:00AM
while (startSlot.Hour < 17) {
// Construct time slot class
startSlot = startSlot.AddMinutes(15);
}
这将为您提供startSlot
值,从每个日期的上午8:00开始,到下午5点(即最后一个是下午4:45)。
答案 1 :(得分:3)
你为什么要考虑从无中心建立这个?
为什么不开始使用现成的众多日历管理程序之一?例如,Microsoft Outlook包含日历和日程管理,您可以轻松地完成所描述的所有操作。它还通过.ICS文件与其他计划工具集成,与移动设备同步,与Google日历同步等。
但还有很多其他选择。谷歌日历是另一个显而易见的。
我不知道为什么你会考虑从头开始。除非这是一次学术练习(不,我并不是说你在学术界工作),那么你应该使用更大的构建块来开始。
这就像建造一个结构,从沙子和水开始,而不是预制的混凝土砌块。
答案 2 :(得分:1)
快速实施。如果您需要一些意见,请告诉我。
// Round interval
const int roundInterval = 15;
var remainder = fromDate.TimeOfDay.Minutes % roundInterval;
var curTime = remainder == 0 ? fromDate : fromDate.AddMinutes(roundInterval - remainder);
curTime = curTime.AddSeconds(-curTime.TimeOfDay.Seconds);
var delta = TimeSpan.FromMinutes(roundInterval);
while (curTime < toDate)
{
while (curTime.DayOfWeek == DayOfWeek.Saturday || curTime.DayOfWeek == DayOfWeek.Sunday)
{
curTime = curTime.Date.AddDays(1);
}
if (curTime.TimeOfDay.Hours < 8)
{
curTime = curTime.AddHours(8 - curTime.TimeOfDay.Hours);
curTime = curTime.AddMinutes(-curTime.TimeOfDay.Minutes);
continue;
}
if (curTime.TimeOfDay.Hours >= 17)
{
curTime = curTime.AddHours(24 - curTime.TimeOfDay.Hours);
curTime = curTime.AddMinutes(-curTime.TimeOfDay.Minutes);
continue;
}
TSList.Add(new TimeSlot(curTime, true));
curTime = curTime.Add(delta);
}
}
答案 3 :(得分:-1)
DateTime myScheduledTimeSlot = new DateTime(2010, 10, 26, 8, 45, 0);
// Use existing check to check day of week constraint...
// Check if the datetime falls on a correct minute boundary
switch (myScheduledTimeSlot.Minute)
{
case 0:
case 15:
case 30:
case 45:
// The time slot is valid
break;
default:
// The time slot is not valid
break;
}
检查它是否属于15分钟的插槽是非常简单的,因为你没有奇怪的界限让每个小时保持一致。如果您想节省一些时间进行事件/日程安排,我建议您查看Quart.NET。