// 测试方法
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; }
}