C#中的DateTime间隔限制

时间:2010-10-24 23:09:19

标签: c# datetime

问题: 我正在为学校的顾问实施调度程序。调度程序假设在星期一到星期五的上午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>();

请注意,有效的时间段表示以下内容:

  1. 日期在:周一至周五。
  2. 时间在:上午8:00至下午5:00
  3. 时间段:15分钟间隔。
  4. 另外,我有一个方法填写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);
            }
    
        }
    

    请注意,我只能满足有效时段条件中的第一个条件。因此,我只能将日期限制在星期一到星期五的范围内。

    问题: 我试图在一个时间段内实现缺少的两个有效条件:

    1. 如何将时间限制为仅上午8:00至下午5:00?
    2. 如何将时间间隔隔开15分钟?

4 个答案:

答案 0 :(得分:3)

首先,请使用DayOfWeek.SaturdayDayOfWeek.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