启明星请假系统里,计算工作日的实现

启明星新版增加系统,增加了请假时长的自动计算。本文讨论请假系统算法的实现。(如果您有好的算法,欢迎和我联系。)

在请假前,我们假定,公司的工作时间是 上午:8:00--12:00 下午13:00--17:00。 中间一个小时是午饭时间。

(1)首先考虑当天请假情况,例如今天是2014-6-25日。

假设用户请假是从  2014-6-25 9:00:00 到 2014-6-25 16:00:00

那么,如果人工算的话,应该是分为两端:

(a)计算 9:00--12:00的时段(3个小时)

(b)计算13:00--16:00的时段(3个小时)

也就是,用户其实请假是3+3 共6个小时。

但是用户请假时间是任意选择的,他可能选择从7:00--16:00,那么7:00--8:00这一个小时,是不算请假的。

如果我们把用户的请假时代用AB表示,作息上午时间用CD表示,作息下午时间用EF表示

那么一天的请假其实是计算2个时间段的交集,也就是请假时长= AB∩CD+AB∩EF

下面考虑AB∩CD也就是求2个时间段的交集,这需要考虑六种情况:(具体略,高中高数求集合交集时常用的方法。)

为此,我们可以写出一个方法:Get2TimeSpan 获取2个时间段有多长(单位为分钟。)

        private double Get2TimeSpan(DateTime dt1, DateTime dt2, DateTime dt3, DateTime dt4)
        {
            //1.
            if (dt4 <= dt1)
                return 0;
            //2.
            if (dt3 >= dt2)
                return 0;

            //3
            if (dt1 >= dt3 && dt1 <= dt4 && dt4 <= dt2)
                return (dt4 - dt1).TotalMinutes;

            //4
            if (dt1 <= dt3 && dt3 <= dt2 && dt2 <= dt4)
                return (dt2 - dt3).TotalMinutes;

            //5
            if (dt1 <= dt3 && dt4 <= dt2)
                return (dt4 - dt3).TotalMinutes;

            return (dt2 - dt1).TotalMinutes;

        }

上面的方法是2个时间的交集,一天其实是分上午和下午,共2个,所以我们可以写一个获取一天内,交集多长的函数

        public double GetSameDayTimeSpan(DateTime dt1, DateTime dt2, DateTime base1, DateTime base2, DateTime base3, DateTime base4, DataTable table)
        {
            if (isWorkDay(dt1, table))
            {
                return Get2TimeSpan(dt1, dt2, base1, base2) + Get2TimeSpan(dt1, dt2, base3, base4);
            }
            else
            {
                return 0;
            }
        }

这样,我们就可以获取,一天内,用户请假时长的放上。

(2)请假跨天的情况

请假跨天时,我们需要知道每一天是否是工作日。 这里,是不是工作日并不完全是否是周六或者周日决定,因为例如国庆节10.1日,不管是否是工作日,都放假的。

所以,我们需要判断一个工作日是否是工作日:

   public bool isWorkDay(DateTime dt, DataTable  table)
        {
            bool isworkday = false;

            DataView dv = table.DefaultView;
            dv.RowFilter = " sdate=#" + dt.ToString("yyyy-MM-dd") + "#";
            if (dv.Count > 0)
            {
                isworkday = dv[0]["isworkday"].ToString() == "1" ? true : false;
                return isworkday;
            }

            if (dt.DayOfWeek == DayOfWeek.Saturday || dt.DayOfWeek == DayOfWeek.Sunday)
            {
                return false;
            }

            return true;

        }

这里,以用户自定义的日期优先级最高。如果不存在用户自定义的,则自动使用默认的日期。

在启明星请假系统里,是一天天的进行判断跨天请假的,如果是工作日,直接返回当天时长,否则返回为0

int day = (odt2 - odt1).Days; 

                   for (int i = 0; i <= day; i++)
                   {
                       if (i == 0)
                       {
                           _base = odt1.AddDays(i).ToString("yyyy-MM-dd");
                           base1 = DateTime.Parse(_base + " " + dtfrom1);
                           base2 = DateTime.Parse(_base + " " + dtto1);
                           base3 = DateTime.Parse(_base + " " + dtfrom2);
                           base4 = DateTime.Parse(_base + " " + dtto2);
                           tdt = base4;
                           totalMiniter+= GetSameDayTimeSpan(odt1, tdt, base1, base2, base3, base4, table2);
                       }
                       else
                       {
                           if (i == day)
                           {
                               //最后一天
                            _base = odt1.AddDays(i).ToString("yyyy-MM-dd");
                           base1 = DateTime.Parse(_base + " " + dtfrom1);
                           base2 = DateTime.Parse(_base + " " + dtto1);
                           base3 = DateTime.Parse(_base + " " + dtfrom2);
                           base4 = DateTime.Parse(_base + " " + dtto2);
                           tdt = base1;
                           totalMiniter+= GetSameDayTimeSpan(base1, odt2, base1, base2, base3, base4, table2);

                           }
                           else
                           {
                               tdt = odt1.AddDays(i);
                               if (isWorkDay(tdt, table2))
                               {
                                   totalMiniter += workDayTotalMiniter;
                               }
                               else
                               {
                                   totalMiniter += 0;
                               }

                           } 

                       }
                   }

               }

               return totalMiniter; 

到此,我们与大家分享了启明星请假系统里,工作日的算法。如果您有好的算法,欢迎与我们联系。

启明星请假系统里,计算工作日的实现,布布扣,bubuko.com

时间: 2024-07-28 16:22:55

启明星请假系统里,计算工作日的实现的相关文章

打造基于hadoop的网站日志分析系统(5)之spark在日志分析系统里的简单应用

1.下载spark和运行 wget http://apache.fayea.com/apache-mirror/spark/spark-1.0.0/spark-1.0.0-bin-hadoop2.tgz 我这里下载的是1.0.0版,由于我们只是测试spark的用法所以不需要配置spark集群,只需把下好的文件解压,进入bin/文件夹. spark支持scala,java和python. scala和java输入命令:./spark-shell python 输入命令 ./pyspark 进入控制

启明星会议室系统与Office365集成说明

在本文,我们将介绍如何配置Office365,以便改系统能够支持启明星会议室预定系统. In this article, we will introduct how to config microsoft office365 to enable it to support dotnetcms.org book system. 1.以管理员的身份登陆office365. 1.login into office365 with administrator role. 2.当登陆成功后,可以在右上角的

大学四年挂了五六门,清考没把握过?侥幸的找人改教务系统里挂科解决办法!

亲们请不要着急找网上的黑客改成绩, 首先,先登录教务系统,看下教务系统是什么版本,很明显,教务系统下面有版权: 学校是外面买的教务系统,如果是正方或者URP或者青果或者乾豪或者金仕达 的则可以达到目的! 首先先分析自己的成绩情况! 请注意,如果以下三点你有的话,那么我帮不了你了! 1,你是否在学校里是极其受关注的学生? 或者是挂科大王,基本全挂呢? 如果是,请绕道! 2,是否很多同学知道你挂科,身边同学知道你找关系活动去弄成绩,或者找人改,同学会举报你吗? 会请绕道! 3,是否辅导员,任课老师,

定制progrebar-如何让控件在2.x系统里显示holo风格(4.x系统下的控件风格)

定制progrebar,这里以progrebar(small)为例,使之在2.x系统里显示holo风格. 1)找到系统文件styles.xml 和themes.xml. 在目录adt-bundle\sdk\platforms\android-19\data\res\values下找到styles.xml和  themes.xml,用Uedit打开: 2) 在系统的styles.xml中搜索控件名称progrebar,找到 "  <style name="Widget.Holo.P

如何在同一系统里同时启动多个Tomcat

需要在同一系统里启动多个tomcat,应该怎么处理? tomcat是个服务程序,需要占用几个通讯端口,所以默认情况是不能启动多个tomcat,如果要启动多个tomcat,需要修改配置文件,通过在配置文件设置不同的通讯端口就可以做到.文件 %TOMCAT_HOME%/conf/server.xml 是tomcat服务配置文件,里面有很多配置项,本文只关注怎么修改端口,其他配置项的含义不做说明.下面把该配置文件中各端口的含义说明下. <Server port="8005" shutd

基于JSP的学生请假系统开发视频教程

课程介绍 : 课程来源于:学途无忧网 课程讲师:大华老师 课程介绍地址:http://www.xuetuwuyou.com/course/11 课程下载地址:链接: http://pan.baidu.com/s/1nth9PJ7 密码: xpw6 一.课程使用到的软件:Myeclipse10.Oracle11g.PL/SQL developer7.11 二.涉及技术或理论: 1.java面向对象.面向接口程序设计 2.观察者模式.策略模式.责任链模式等经典设计模式 3.数据库设计理论(三大数据模

SAP系统里有很多用来控制密码的参数

SAP系统里有很多用来控制密码的参数,例如: 1.login/password_max_idle_initial  这些参数可以用来控制比如初始密码多久没登录会过期 2.login/password_max_idle_productive productive密码(就是管理员初始化以后用户自己改过的密码)多久不登录会过期 3.login/password_history_size 用户改密码时不可以用最近几次曾用过的密码 转载于SAP学习门户网,原文链接:http://www.sap6.com/

python一些模块的exe安装包在windows的64位系统里识别不到已安装Python目录的解决方法

在windows里安装python一些模块时候,有时候源码安装比较困难,pip install也各种报错,这时候最喜欢用别人编译好的exe或者whl文件来安装,但是在windows的64位系统里,如果有一些安装包没怎么考虑过在64位系统上的安装,在安装时候就会找不到你自己安装的python目录. 解决法子:运行国外这个脚本,即可把你64位系统上的python目录添加至注册表里. # # script to register Python 2.0 or later for use with win

64位系统里注册32位软件

1.在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位COM 注册和程序共存状态,需要WOW64 子系统. 故可以把这些32的dll.ax从C:\Windows\system32\复制到C:\Windows\sysWOW64\下注册即可. 如:regsvr32 C:\Windows\sysWOW64\netconn.dll 2.对于UAC.低权限用户应使用管理员帐户. 3.有时候注册