拆分时间段

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

 

posted @ 2017-09-02 12:58  Coder_小菜  阅读(1274)  评论(0编辑  收藏  举报