zoukankan      html  css  js  c++  java
  • 拆分时间段

          // 测试方法
            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; }
        }
  • 相关阅读:
    碰到了一个GDI+的问题,郁闷ing。。。
    (旧文重贴)对于以前遇到过的ws proxy实例化时间太长的问题,看JNDI受到了些启发
    (旧文重贴)下午又看了MBF的介绍,靠,心丧如死!
    (旧文重贴)前段时间关于SmartClient部署的两个问题,都搞定了。
    (旧文重贴)编程高手箴言读书笔记(1)
    SAP MDM 学习网址
    常用Oralce sql
    WE02 修改IDOC
    OBD/IBD 的拣配数量更新
    配置ALE仓库管理
  • 原文地址:https://www.cnblogs.com/coder-soldier/p/7466400.html
Copyright © 2011-2022 走看看