拆分时间段

      // 测试方法
        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; }
    }
时间: 2024-10-09 18:38:56

拆分时间段的相关文章

SQL Server 中如何做到连续时间段的拆分?

今天在工作中遇到了一个很实际的问题,客户在OA接口的员工休假中间表中提供了连续时间段的休假记录,例如: 张三,2018-12-1 ~2018-12-31 ,病假,31天.这样带来的问题是,如果我需要统计张三从12月1号到12月15号的休假天数,单从这一整条连续记录是无法统计的.这时候就需要我们将一条长记录进行拆分. 这里记录下我自己的思路: 1:利用系统表得到0-2047的序列 ,2048*2048绝对够用了吧 SELECT sv.number AS n FROM MASTER.dbo.spt_

oracle处理考勤时间,拆分考勤时间段的sql语句

最近一直在用mysql数据库做云项目,有段时间没有接触oracle了,昨天有朋友叫我帮忙用oracle处理一个考勤记录的需求,我在考虑如何尽量精简实现上面花了一段时间.于是把这个实现做个记录. 需求如下: rownum为奇数的为进厂时间,偶数的为离场时间 第一个奇数行的时间被第一个偶数行相减,以此类推 将上面两步产生的时间结果集相加得出总时间作为当天考勤时间 最终能和别的表联合起来形成这样的展示: 人员 日期 工时 入厂时间 出厂时间 张三 2015/6/18 9小时30分钟 8:00:00 1

从数据闭环谈微服务拆分

Tips:关注公众号:松花皮蛋的黑板报,领取程序员月薪25K+秘籍,进军BAT必备! 数据闭环,并不是说我们要将所有的功能全包揽在身上,不依赖其他业务方,也不依赖中台.而是想强调一件事,那就是业务问题排查过程尽量不要牵扯过多团队,因为数据链路越长越乱处理问题时效性越差,服务性能往往也不尽人意.我先分享个案例给你,或许能帮助你理解和产生共鸣. 我们有一个内容渠道是直播,渠道权限和创建直播间入口都是我们来维护的,但是创建直播后的内容保存接口是直播团队维护的,保存接口会校验达人权限和等级,而校验接口又

C# 将Access中时间段条件查询的数据添加到ListView中

C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集合中添加表头中的文字. 二.利用代码给ListView添加Item. 首先,ListView的Item属性包括Items和SubItems.必须先实例化一个ListIteView对象.具体如下: ListViewItem listViewItem=new ListViewItem(); l

文件拆分成指定大小(IO流)

1 package stream; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.Arrays; 8 9 public class TestStream { 10 11 public static void main(String[] args) { 12 i

maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)

前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆分与聚合原理 问题描述:将ssh工程拆分为多个模块开发 1.1.拆分原理 创建一个maven project(pom),然后在创建三个子模块(maven moudule),其中三个子模块,分别为 dao.service.web,也就是将三层的内容分别独立为一个项目,进一步将耦合性降低,其中如何将他们

【原】公司P2P平台的功能拆分

银行回调:由原来写在PC门户项目中拆分开来,作为一个专门处理回调的项目,配置多个数据源,实时写入数据库. 定时回查:由原来写在PC后台管理项目中拆分开来,作为一个专门回查银行网关的项目. 请求银行:由原来写在common jar项目中拆分开来,对外提供诸如投标.充值.提现等接口,由这个项目负责同步或异步请求银行. 系统奖励发放:由原来写死在不同项目的发放例如体验金.积分.红包这种奖励拆分开,单独作为一个项目对外提供rpc,调用者采用异步线程池进行调用. 登陆注册:由原来写在PC门户项目拆分开来,

(18)Powershell中的字符串拆分运算符

Powershell中提供了对字符串的拆分操作运算符.-split 运算符将一个字符串拆分成多个字符串. 拆分运算符 拆分运算符用于将一个或多个字符串拆分为多个子字符串.可更改拆分操作的以下元素: (1)定界符.默认为空白,但是可指定字符.字符串.模式或用于设置定界符的脚本块. (2)子字符串的最大数目.默认设置为返回所有子字符串.如果指定的数字小于子字符串数,则其余子字符串将合并到最后一个子字符串中. (3)用于指定定界符匹配条件的选项,如 SimpleMatch 和 Multiline. 拆

RandomAccessFile拆分合并文件

import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.io.SequenceInputStream; import java.util.Vector; public class RandonFileAccessTest { public static void main(String[]