工作时间计算(节假日,调休,周末,加班,正常时间)

计算两个时间之内的工作时长:

public static List<LaborTimeInfo> AllTimes(string fromDate ,string toDate)
        {
            DateTime f = DateTime.Parse(fromDate);
            DateTime t = DateTime.Parse(toDate);
            List<LaborTimeInfo> laborTimes = new List<LaborTimeInfo>();
            List<LaborTimeInfo> laborFrom = new List<LaborTimeInfo>();
            List<LaborTimeInfo> laborMiddle = new List<LaborTimeInfo>();
            List<LaborTimeInfo> laborTo = new List<LaborTimeInfo>();
            List<WorkingTimeListInfo> ws = new List<WorkingTimeListInfo>();
            WorkingTimeListInfo nomal = new WorkingTimeListInfo();
            ws = ListWorkingTime("", "", "1", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "");
            foreach (var item in ws)//找到正常上下班时间比如:朝九晚五
            {
                if (item.startHour!=0&&item.endHour!=0)
                {
                    nomal = item;
                }
            }
            if (nomal.workingTimeId<=0)//如果未定义那么就按朝九晚五计算
            {
                nomal.startHour = 9;
                nomal.startMinute = 0;
                nomal.endHour = 17;
                nomal.endMinute = 0;
            }
            TimeSpan ts = t.Subtract(f);//时间差
            if (ts.Days < 0)
            {
                return laborTimes;
            }
            else if (ts.Days==0)//如果开始和计算是同一天
            {
                laborFrom = CalLaborHours(f.ToString(), f.Hour.ToString(), f.Minute.ToString(), t.Hour.ToString(), t.Minute.ToString());
            }
            else
            {
                laborFrom = CalLaborHours(f.ToString(), f.Hour.ToString(), f.Minute.ToString(), nomal.endHour.ToString(), nomal.endMinute.ToString());
                for (int i = 1; i < ts.Days; i++)//两天之间的每一天都要去计算工作时长
                {
                    laborMiddle = CalLaborHours(f.AddDays(i).ToString(), nomal.startHour.ToString(), nomal.startMinute.ToString(), nomal.endHour.ToString(), nomal.endMinute.ToString());
                    foreach (var from in laborFrom)//循环把中间天的时长加起来,中间的都按照定义的正常的上班时间
                    {
                        foreach (var mid in laborMiddle)
                        {
                            if (from.laborType == mid.laborType)
                            {
                                from.hours = from.hours + mid.hours;
                            }
                        }
                    }
                }
                laborTo = CalLaborHours(t.ToString(), nomal.startHour.ToString(), nomal.startMinute.ToString(), t.Hour.ToString(), t.Minute.ToString());
                foreach (var from in laborFrom)//最后一天的时长,并加起来
                {
                    foreach (var to in laborTo)
                    {
                        if (from.laborType==to.laborType)
                        {
                            from.hours=from.hours + to.hours;
                        }
                    }
                }
            }
            laborTimes = laborFrom;
            return laborTimes;
        }

        //Added
        public static List<LaborTimeInfo> CalLaborHours(string date, string startHour, string startMinute, string endHour, string endMinute)
        {//计算每一天的工作时长
            string laborType = "";
            int istartHour = 0;
            int istartMinute = 0;
            int iendHour = 0;
            int iendMinute = 0;
            decimal totalHours = 0;
            string year = "";
            string month = "";
            string day = "";
            string dayOfWeek;
            bool flag = false;//判断当天是不是假期或者周末时用。如果是周末,则不加入到正常时长

            WorkingTimeListInfo w = new WorkingTimeListInfo();
            WorkingTimeListInfo w2 = new WorkingTimeListInfo();
            List<WorkingTimeListInfo> ws = new List<WorkingTimeListInfo>();
            LaborTimeInfo laborTime = new LaborTimeInfo();
            LaborTimeInfo laborTime2 = new LaborTimeInfo();
            LaborTimeInfo laborTime3 = new LaborTimeInfo();
            LaborTimeInfo laborTime4 = new LaborTimeInfo();
            List<LaborTimeInfo> laborTimes = new List<LaborTimeInfo>();
            List<LaborTimeInfo> normalLaborTimes = new List<LaborTimeInfo>();
            StringBuilder strSQL = new StringBuilder();

            if (String.IsNullOrEmpty(date))
            {
                return laborTimes;
            }

            DateTime dt = DateTime.Parse(date);
            year = dt.Year.ToString();
            month = dt.Month.ToString();
            day = dt.Day.ToString();
            dayOfWeek = dt.DayOfWeek.ToString();

            if ((String.IsNullOrEmpty(startHour) == true) || (String.IsNullOrEmpty(endHour) == true))
                return laborTimes;

            if (String.IsNullOrEmpty(startMinute) == true)
                startMinute = "0";

            if (String.IsNullOrEmpty(endMinute) == true)
                endMinute = "0";

            istartHour = int.Parse(startHour);
            istartMinute = int.Parse(startMinute);
            iendHour = int.Parse(endHour);
            iendMinute = int.Parse(endMinute);

            if ((istartHour < 0) || (istartHour > 24))
                return laborTimes;
            if ((iendHour < 0) || (iendHour > 24))
                return laborTimes;
            if ((istartMinute < 0) || (istartMinute > 59))
                return laborTimes;
            if ((iendMinute < 0) || (iendMinute > 59))
                return laborTimes;


            totalHours = iendHour - istartHour + decimal.Round(new decimal(iendMinute - istartMinute) / 60, 2);//计算当天的工作总时间
            if (totalHours <= 0)
                return laborTimes;

            w = SearchHoliday(year,month, day);//判断是不是假期
            if (w.workingTimeId > 0)
            {
                flag = true;
                laborTime.laborType = w.laborType;
                laborTime.date = date;
                laborTime.dayOfWeek = dayOfWeek;
                laborTime.hours = totalHours;

                laborTimes.Add(laborTime);

                //return laborTimes;
            }
            else
            {
                laborTime.laborType = "4";
                laborTime.date = date;
                laborTime.dayOfWeek = dayOfWeek;
                laborTime.hours = 0;

                laborTimes.Add(laborTime);
            }

            w2 = SearchWeekEnd(year,month, day, dayOfWeek);//判断是不是周末(判断这天是不是调休的)
            if (w2.workingTimeId > 0)//是周末并且不是调休
            {
                flag = true;
                laborTime2.laborType = w2.laborType;
                laborTime2.date = date;
                laborTime2.dayOfWeek = dayOfWeek;
                laborTime2.hours = totalHours;

                laborTimes.Add(laborTime2);

                //return laborTimes;
            }
            else
            {
                laborTime2.laborType ="3";
                laborTime2.date = date;
                laborTime2.dayOfWeek = dayOfWeek;
                laborTime2.hours = 0;

                laborTimes.Add(laborTime2);
            }
            if (flag)//如果是周末或者节假日的话,正常的时长置0
            {
                laborTime3.laborType = "2";
                laborTime3.date = date;
                laborTime3.dayOfWeek = dayOfWeek;
                laborTime3.hours = 0;

                laborTimes.Add(laborTime3);

                laborTime4.laborType = "1";
                laborTime4.date = date;
                laborTime4.dayOfWeek = dayOfWeek;
                laborTime4.hours = 0;

                laborTimes.Add(laborTime4);
            }
            else
            {
                laborType = "2";         //正常加班
                laborTimes.AddRange(CalNormalLaborHours(date, laborType, startHour, startMinute, endHour, endMinute));

                laborType = "1";         //正常工作
                normalLaborTimes = CalNormalLaborHours(date, laborType, startHour, startMinute, endHour, endMinute);
                laborTimes.AddRange(normalLaborTimes);
            }
            return laborTimes;
        }

  

转载于:https://www.cnblogs.com/yangfan5157/p/6137519.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: networkdays函数是一种在Excel中用于计算两个日期之间工作日数量的函数。它可以用于计算两个日期之间的实际工作日数量,排除掉周末和指定的节假日。如果在节假日期间调休上班,也可以在计算工作日数量时进行调整。 在使用networkdays函数时,需要指定两个日期和一个节假日列表。节假日列表可以是一个单独的单元格范围,也可以是由多个单元格范围组成的数组。如果没有指定节假日列表,则默认排除周六和周日。 当遇到节假日调休情况时,可以将调休日期添加到节假日列表中。这样,在计算工作日数量时,调休日期就会被排除在外,不会计算在内。这样可以保证计算的结果是准确的。 使用networkdays函数可以方便地计算节假日调休后的工作日数量,从而可以更好地安排工作时间。它可以应用于各种场景,比如项目管理、假期计划等,帮助我们更好地利用时间,提高效率。 ### 回答2: Networkdays是一个Excel函数,用于计算两个日期之间工作日天数。而节假日调休则是指将法定节假日调整到周末,并在周末加班,以保障每年休假天数不变的做法。对于这个问题,我们可以这样回答: 网络工作日函数(networkdays)是一种用于计算两个日期之间工作日天数的Excel函数。而节假日调休是一种管理者为了调整法定节假日与员工工作时间的关系而采取的措施。通常情况下,法定节假日是固定的,但为了保障员工的休假权益,当某一法定节假日恰好与周末相连时,会将这个法定节假日调整到周末,从而延长员工的休假时间。此外,在调整后的周末,员工可能需要加班以弥补因调休而延长的休假时间。这样,可以保证每年员工享有的休假天数不变。networkdays函数在计算两个日期之间工作日天数时,可以排除掉调休后的周末,从而得到准确的工作日数。因此,networkdays函数在处理节假日调休后的工作计算中非常有用。总之,networkdays函数和节假日调休都是为了确保员工的工作时间和休假时间能够得到合理安排的工具和措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值