拆分时间段
// 测试方法 static void TestSplitTime() { DateTime begin = DateTime.Parse("2017-1-1 8:00"); DateTime end = DateTime.Parse("2017-1-1 22:00"); List<Time> lst = new List<Time>() { new Time(){ Begin=DateTime.Parse("2017-1-1 9:00"), End=DateTime.Parse("2017-1-1 10:00")}, new Time(){ Begin=DateTime.Parse("2017-1-1 11:00"), End=DateTime.Parse("2017-1-1 12:00")}, new Time(){ Begin=DateTime.Parse("2017-1-1 14:00"), End=DateTime.Parse("2017-1-1 15:00")} }; SplitTime(begin, end, lst); } /// <summary> /// 拆分时间段 lst中的时间段必须在begin和end内(获得可用和不可用的时间段) /// </summary> /// <param name="begin">开始时间</param> /// <param name="end">结束时间</param> /// <param name="lst">已被使用的时间段</param> static void SplitTime(DateTime begin, DateTime end, List<Time> lst) { List<Time> tmp = (List<Time>)lst.OrderBy(n => n.Begin).ToList(); Time minTime = tmp.Where(n => n.Begin == tmp.Min(m => m.Begin)).First(); Time maxTime = tmp.Where(n => n.End == tmp.Max(m => m.End)).First(); // 存储不可用时间段 List<Time> lstTmp = new List<Time>(); // 第一个时间段 if (minTime.Begin > begin) { lstTmp.Add(new Time() { Begin = begin, End = minTime.Begin }); } // 最后一个时间段 if (maxTime.End < end) { lstTmp.Add(new Time() { Begin = maxTime.End, End = end }); } // 中间时间段 for (int i = 0; i < tmp.Count; i++) { if (tmp.Count - 1 == i) { // 如果是最后一个时间段,则直接退出 break; } if (tmp[i].End != tmp[i + 1].Begin) { // 前一时间段的结束时间 不等于 下一个时间段的开始时间 lstTmp.Add(new Time() { Begin = tmp[i].End, End = tmp[i + 1].Begin }); } } // 合并可用的时间段 lstTmp.AddRange(lst); foreach (Time t in lstTmp.OrderBy(n => n.Begin).ToList()) { Console.WriteLine(string.Format("{0}至{1}", t.Begin.ToString("yyyy-MM-dd HH:mm"), t.End.ToString("yyyy-MM-dd HH:mm"))); } } class Time { public DateTime Begin { get; set; } public DateTime End { get; set; } }