考勤系统之计算工作小时数

/// <summary>
        /// 计算今天有效工作小时数
        /// </summary>
        public static Decimal GetWorkHour(CheckOnModel todayCheckOn)
        {
            //计算今天有效工作小时数
            //正常情况上下班 早上早与9:00 下班晚于18:00

            DateTime amTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 09:01");
            DateTime pmTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 18:00");

            DateTime noonBreakStartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 12:30");
            DateTime noonBreakEndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 13:30");


            CheckOnModel copyCheckOn = CheckOnModel.DeepCopy(todayCheckOn);

            //扣除一个小时午休
            bool subtractOneHour = true;
            //早于9:05分上班 上班打卡时间从9点起算
            if (todayCheckOn.OnDutyTime.Value <= amTime)
            {
                copyCheckOn.OnDutyTime = amTime.AddMinutes(-1);
            }
            //在午休时间上班 从午休结束时开始算
            if (todayCheckOn.OnDutyTime.Value >= noonBreakStartTime && todayCheckOn.OnDutyTime.Value <= noonBreakEndTime)
            {
                copyCheckOn.OnDutyTime = noonBreakEndTime;
                subtractOneHour = false;//不再扣除午休时间
            }

            //从午休结束后开始上班
            if (todayCheckOn.OnDutyTime.Value >= noonBreakEndTime)
            {
                subtractOneHour = false;//不再扣除午休时间
            }

            //下班打卡时间从18点起算
            if (todayCheckOn.OffDutyTime.Value >= pmTime)
            {
                copyCheckOn.OffDutyTime = pmTime;
            }
            //下班时间介于午休时间
            if (copyCheckOn.OffDutyTime.Value >= noonBreakStartTime && copyCheckOn.OffDutyTime.Value < noonBreakEndTime)
            {
                copyCheckOn.OffDutyTime = noonBreakStartTime;
                subtractOneHour = false;//不再扣除午休时间
            }
            //下班时间早于午休时间
            if (copyCheckOn.OffDutyTime.Value < noonBreakStartTime)
            {
                subtractOneHour = false;//不再扣除午休时间
            }

            if (subtractOneHour)
            {
                copyCheckOn.WorkHour = Convert.ToDecimal((copyCheckOn.OffDutyTime.Value - copyCheckOn.OnDutyTime.Value).TotalHours - 1);
            }
            else
            {
                copyCheckOn.WorkHour = Convert.ToDecimal((copyCheckOn.OffDutyTime.Value - copyCheckOn.OnDutyTime.Value).TotalHours);
            }
            //午休时间打卡走人的,可能为负数
            if (copyCheckOn.WorkHour < 0)
            {
                copyCheckOn.WorkHour = 0;
            }

            //补签成功的 视为正常打卡 但要减去扣除小时数
            if (copyCheckOn.Status == "Y" && copyCheckOn.EditMan != new Guid())
            {
                copyCheckOn.WorkHour = 8 - copyCheckOn.SubtractHour;
            }

            return copyCheckOn.WorkHour;
        }

 

转载于:https://www.cnblogs.com/dongh/p/6603887.html

试题:该程序(Test.exe)用于统计、记录某单位全体员工一天的考勤情况。 输入:员工基本信息文件(文本文件)、全天出入记录的数据文件(文本文件) 1. 员工基本信息文件(参见employee.txt) 每行记录一位员工的基本信息,格式为:姓名,工号(例如:张三,34251),其中姓名(不超过20个字符)和工号(整型); 2. 全天出入记录的数据文件(参见log.txt) 该单位的门禁系统每天生成一个员工全天出入记录的数据文件,记录出入的工作人员工号、出入的时间以及出入类型(O:出,I:入), 记录按时间先后记录 文件中每行记录一次出或入的信息 每条记录的格式为:工号,时间,类型(例如:34251,08:30,I),其中时间格式为hh:mm。 程序要完成的功能 请通过程序读取员工基本信息文件和门禁系统全天出入记录的数据文件,计算工作人员当天的总共在岗时间,并将结果保存至c:\result.txt文件中。要求结果中包含有姓名,工号,在岗时间等信息。 注:员工基本信息文件和数据文件的名称通过命令行参数的形式输入 (例如:Test.exe employee.txt log.txt)。 输出:员工在岗时间统计文件(文本文件) 员工在岗时间统计文件(参见result.txt) 文件中每行记录一位工作人员的在岗时间信息。 格式为:姓名,工号,在岗时间(例如:张三,34251,8小时10分钟)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值