C# C语言中的日期时间间隔限制#

C# C语言中的日期时间间隔限制#,c#,datetime,C#,Datetime,问题: 我正在为我在学校的导师实施一个计划。调度程序假定从周一到周五的上午8:00到下午5:00设置一个15分钟的间隔时间段。此外,advisor必须指定计划程序的开始和结束日期。调度程序还将提供一个选项,用于指定15分钟的时间段是否未打开。这意味着我的顾问将能够将特定的时间段标记为不可用 到目前为止我拥有的: 我创建了一个简单的类: public class TimeSlot { public DateTime dateTime {

问题: 我正在为我在学校的导师实施一个计划。调度程序假定从周一到周五的上午8:00到下午5:00设置一个15分钟的间隔时间段。此外,advisor必须指定计划程序的开始和结束日期。调度程序还将提供一个选项,用于指定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>();
List TSList=newlist();
请注意,有效的时隙表示以下内容:

  • 日期为:周一至周五
  • 时间在:上午8:00到下午5:00之间
  • 时间间隔在:15分钟内
  • 此外,我还有一种方法,可按如下方式填写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);
            }
    
        }
    
    private void按钮\u下一步\u单击(对象发送者,路由目标)
    {
    /*从GUI控件获取fromDate和toDate的值*/
    DateTime fromDate=datePicker1.SelectedDate.Value;
    DateTime toDate=datePicker2.SelectedDate.Value;
    
    (fromDate首先,请使用
    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);
    }
    
    DateTime startSlot=fromDate.Date.AddHours(8);//从上午8:00开始
    同时(开始时点<17){
    //构造时隙类
    startSlot=startSlot.AddMinutes(15);
    }
    

    这将为您提供从每天上午8:00开始到下午5点(即最后一个是下午4:45)的
    startSlot
    值。

    只需快速执行即可。如果您需要一些意见,请告诉我

            // 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);
            }
        }
    
    //四舍五入间隔
    const int roundInterval=15;
    var余数=fromDate.TimeOfDay.Minutes%roundInterval;
    var curTime=余数==0?fromDate:fromDate.AddMinutes(roundInterval-余数);
    curTime=curTime.AddSeconds(-curTime.TimeOfDay.Seconds);
    var delta=时间跨度,从分钟开始(roundInterval);
    while(curTime=17)
    {
    curTime=curTime.AddHours(24-curTime.TimeOfDay.Hours);
    curTime=curTime.AddMinutes(-curTime.TimeOfDay.Minutes);
    继续;
    }
    TSList.Add(新时隙(curTime,true));
    curTime=curTime.Add(增量);
    }
    }
    
    你为什么要考虑白手起家

    为什么不从现成的众多日历管理程序中的一个开始呢?例如,Microsoft Outlook包含日历和日程管理,您可以轻松地完成所有描述的工作。它还通过.ICS文件与其他日程安排工具集成,与移动设备同步,与Google C同步阿伦达,等等

    但是还有很多其他的选择。谷歌日历是另一个显而易见的选择

    我不知道为什么你会考虑从零开始。除非这是一个学术性的练习(不,我不是说你在学术界工作),那么你应该用更大的积木开始。

    这就像建造一个结构,从沙子和水开始,而不是预制混凝土块

    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分钟的时段内是非常简单的,因为你没有让每小时保持一致的奇怪界限。如果你想节省一些时间做事件/日程安排,我建议检查一下。

    我会查看
    TimeSpan
    结构。我通常不在C#中工作,所以对这个建议持保留态度。哟你可以为每个sesion存储一个定义为“中间”的日期时间-这样,如果两个时隙发生冲突,你只需检查它们的日期时间是否彼此相差+-15分钟。这里的一个风格点实际上是你实际问题的一个次要问题,所以我将它作为注释保留。如果有人将无效数据传递给你的构造函数创建一个新的时间段对象,你想抛出一个异常。但在构造函数中抛出异常通常不是最好的主意。因此,这里更好的选择可能是一个私有构造函数和一个
    公共静态时间段创建(DateTime,bool)
    方法。在核心框架中有几个这种模式的例子。甚至windows scheduler也可以做调度部分。然后你可以专注于“任务”部分。我猜我是在假设,当他说“8-5点和周一-周五”正在计划的资源是一个人,可能是他的顾问。在这种情况下,Windows任务计划程序()这不是正确的做法。而且Windows任务计划程序没有内置的智能来处理诸如限制M-F或需要15分钟的插槽等问题。对不起,但我看不出这将如何回答如何限制日期时间值以满足给定条件的问题……此外,如果每个程序员只编写了一个这是以前不存在的,优秀的程序员会少很多…因为这可能是大学/学校的一个项目。这并不会让问题变得不那么有效。好吧,如果这是一个学校项目-一个学习项目-那么是的,我可以理解为什么你会从无到有。如果这真的是一个管理计划的项目