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; }
        }
  • 相关阅读:
    C# WinForm开发系列 Socket/WCF/Rometing/Web Services
    .net(c#) 简单的软件注册功能的实现:
    来自xici网友的Ubuntu和windows xp的Super PI性能测试
    最新的Linpack测试指南-基于woodcrest机器
    CFX x86_64 version issues 无法找到可执行文件
    如何检查一个mvapich的版本?
    Intel Tools Training Notes Intel Compiler, MKLs
    Infiniband IPoIB Debug FAQ
    让CFX的license server在开机的时候就自动启动
    FFTW 3.1.2 和 2.1.5编译
  • 原文地址:https://www.cnblogs.com/coder-soldier/p/7466400.html
Copyright © 2011-2022 走看看