获取工作时长

~~


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * 工单耗时工具类
 */
public class TimeConsumingUtils {
    // 设置上班时间:该处时间可以根据实际情况进行调整
    int abh = 8; // 上午上班时间,小时
    int abm = 30; // 上午上班时间,分钟
    int aeh = 11; // 上午下班时间,小时
    int aem = 30; // 上午下班时间,分钟
    int pbh = 13; // 下午上班时间,小时
    int pbm = 0; // 下午上班时间,分钟
    int peh = 17; // 下午下班时间,小时
    int pem = 30; // 下午下班时间,分钟
    long m1 = abh * 60 + abm; // 上午上班时间总分钟数
    long m2 = aeh * 60 + aem; // 上午下班时间总分钟数
    long m3 = pbh * 60 + pbm; // 下午上班时间中分钟数
    long m4 = peh * 60 + pem; // 下午下班时间总分钟数
    long minutesPerDay = m2 - m1 + m4 - m3;// 每天上班分钟数
    /**
     * 判断输入的年月日日期是否属于休息日
     * 
     * @param date
     *            需要判断的日期(年月日)
     * @param lawHolidayList
     *            国家规定放假的时间
     * @param lawWorkList
     *            国家规定的工作日期
     * @return
     */
    public static boolean isDayOff(Date date, List<Date> lawHolidayList, List<Date> lawWorkList) {
        for (Date date1 : lawHolidayList) {
            int c = date.compareTo(date1);
            if (c == 0) {
                // 休息日
                return true;
            }
        }
        for (Date date1 : lawWorkList) {
            int c = date.compareTo(date1);
            if (c == 0) {
                // 工作日
                return false;
            }
        }
        return isZhouLiuZhouRiDate(date);
    }
    /**
     * 判断时间是否属于正常周六日
     * 
     * @param date
     * @return
     */
    public static boolean isZhouLiuZhouRiDate(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int week = cal.get(Calendar.DAY_OF_WEEK) - 1;
//        System.out.println("week=" + week);
        // 是否属于周六日
        boolean flag = (week == 0 || week == 6);
        return flag;
    }
    /**
     * 排除国家法定的休息日、正常周六日,计算两个时间相差多少小时数(休息日当天时间为零处理)
     * 
     * @param startTimeYYYYMMDDHHMMSS
     *            年月日时分秒
     * @param endTimeYYYYMMDDHHMMSS
     *            年月日时分秒
     * @param lawHolidayList
     * @param lawWorkList
     * @return
     */
    public long workHours(Date startTimeYYYYMMDDHHMMSS, Date endTimeYYYYMMDDHHMMSS, List<Date> lawHolidayList,
            List<Date> lawWorkList) throws Exception {
        if (endTimeYYYYMMDDHHMMSS.before(startTimeYYYYMMDDHHMMSS) || endTimeYYYYMMDDHHMMSS.compareTo(startTimeYYYYMMDDHHMMSS) == 0) {
            return 0;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 开始时间转成年月日格式
        String strStartTimeYYYYMMDD = sdf.format(startTimeYYYYMMDDHHMMSS);
        Date startTimeYYYYMMDD = sdf.parse(strStartTimeYYYYMMDD);
        // 开始时间是否属于休息日
        boolean startTimeIsDayOff = isDayOff(startTimeYYYYMMDD, lawHolidayList, lawWorkList);
        // 结束时间转成年月日格式
        String strEndTimeYYYYMMDD = sdf.format(endTimeYYYYMMDDHHMMSS);
        Date endTimeYYYYMMDD = sdf.parse(strEndTimeYYYYMMDD);
        // 结束时间是否属于休息日
        boolean endTimeIsDayOff = isDayOff(endTimeYYYYMMDD, lawHolidayList, lawWorkList);
        // 分为4种情况
        if (startTimeIsDayOff) {
            if (!endTimeIsDayOff) {
                System.out.println("开始时间在休息日里,结束时间不在休息日里");
                // 开始时间在休息日里,结束时间不在休息日里(开始那天不计算小时数,结束那天计算小时数)
                Calendar cal = Calendar.getInstance();
                cal.setTime(startTimeYYYYMMDD);
                cal.add(Calendar.DAY_OF_MONTH, +1);
                Date validStartTimeYYYYMMDD = cal.getTime();
                int workDays = 0;
                // 循环遍历开始时间之后的每一个日期
                while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
                    if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
                        workDays += 1;
                    }
                    cal.add(Calendar.DAY_OF_MONTH, +1);
                    validStartTimeYYYYMMDD = cal.getTime();
                }
                System.out.println("工作整天数" + workDays);
                // 结束时间的总分钟数
                Calendar endCa = Calendar.getInstance();
                endCa.setTime(endTimeYYYYMMDDHHMMSS);
                long endMinutes = endCa.get(Calendar.HOUR_OF_DAY) * 60 + endCa.get(Calendar.MINUTE);
                long endWorkMinutes = 0;
                if (endMinutes < m1) {
                    endWorkMinutes = 0;
                } else if (endMinutes >= m1 && endMinutes <= m2) {
                    endWorkMinutes = endMinutes - m1;
                } else if (endMinutes > m2 && endMinutes < m3) {
                    endWorkMinutes = m2 - m1;
                } else if (endMinutes >= m3 && endMinutes <= m4) {
                    endWorkMinutes = endMinutes - m1 - (m3 - m2);
                } else {
                    endWorkMinutes = minutesPerDay;
                }
                System.out.println("结束时间的总分钟数" + endMinutes);
                System.out.println("结束时间当天的工作总分钟数endWorkMinutes:" + endWorkMinutes);
                return endWorkMinutes + workDays * minutesPerDay;
            } else {
                System.out.println("开始时间在休息日里,结束时间也在休息日里");
                // 开始时间在休息日里,结束时间也在休息日里(开始那天不计算小时数,结束那天也不计算小时数,看中间有多少个工作日)
                Calendar cal = Calendar.getInstance();
                cal.setTime(startTimeYYYYMMDD);
                cal.add(Calendar.DAY_OF_MONTH, +1);
                Date validStartTimeYYYYMMDD = cal.getTime();
                if (startTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) == 0) {
                    System.out.println("开始时间和结束时间在同一天,都为工作日");
                    return 0;
                } else {
                    // 工作日天数
                    int workDays = 0;
                    // 循环遍历开始时间之后的每一个日期
                    while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
                        if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
                            workDays += 1;
                        }
                        cal.add(Calendar.DAY_OF_MONTH, +1);
                        validStartTimeYYYYMMDD = cal.getTime();
                    }
                    System.out.println("工作整天数" + workDays);
                    return workDays * minutesPerDay;
                }
            }
        } else {
            if (endTimeIsDayOff) {
                System.out.println("开始时间不在休息日里,结束时间在休息日里");
                int workDays = 0; // 工作整天数
                // 开始时间不在休息日里,结束时间在休息日里
                Calendar cal = Calendar.getInstance();
                cal.setTime(startTimeYYYYMMDD);
                cal.add(Calendar.DAY_OF_MONTH, +1);
                Date validStartTimeYYYYMMDD = cal.getTime();
                while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
                    if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
                        workDays += 1;
                    }
                    cal.add(Calendar.DAY_OF_MONTH, +1);
                    validStartTimeYYYYMMDD = cal.getTime();
                }
                System.out.println("工作整天数" + workDays);
                Calendar startCa = Calendar.getInstance();
                startCa.setTime(startTimeYYYYMMDDHHMMSS);
                // 开始时间的总分钟数
                long startMinutes = startCa.get(Calendar.HOUR_OF_DAY) * 60 + startCa.get(Calendar.MINUTE);
                long startWorkMinutes = 0;
                if (startMinutes < m1) {
                    startWorkMinutes = minutesPerDay;
                } else if (startMinutes >= m1 && startMinutes <= m2) {
                    startWorkMinutes = m4 - startMinutes - (m3 - m2);
                } else if (startMinutes > m2 && startMinutes < m3) {
                    startWorkMinutes = m4 - m3;
                } else if (startMinutes >= m3 && startMinutes <= m4) {
                    startWorkMinutes = m4 - startMinutes;
                } else {
                    startWorkMinutes = 0;
                }
                System.out.println("开始时间当天的工作总分钟数startWorkMinutes:" + startWorkMinutes);
                // int startHour = ca.get(Calendar.HOUR_OF_DAY);
                return startWorkMinutes + workDays * minutesPerDay;
            } else {
                System.out.println("开始时间不在休息日里,结束时间也不在休息日里");
                // 开始时间不在休息日里,结束时间也不在休息日里
                // 开始时间的总分钟数
                Calendar startCa = Calendar.getInstance();
                startCa.setTime(startTimeYYYYMMDDHHMMSS);
                long startMinutes = startCa.get(Calendar.HOUR_OF_DAY) * 60 + startCa.get(Calendar.MINUTE);
                long startWorkMinutes = 0;
                // 结束时间的总分钟数
                Calendar endCa = Calendar.getInstance();
                endCa.setTime(endTimeYYYYMMDDHHMMSS);
                long endMinutes = endCa.get(Calendar.HOUR_OF_DAY) * 60 + endCa.get(Calendar.MINUTE);
                long endWorkMinutes = 0;
                if (startTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) == 0) {
                    System.out.println("开始时间和结束时间在同一天,都为工作日");
                    if (startMinutes < m1) {
                        if (endMinutes < m1) {
                            return 0;
                        } else if (endMinutes >= m1 && endMinutes <= m2) {
                            return endMinutes - m1;
                        } else if (endMinutes > m2 && endMinutes < m3) {
                            return m2 - m1;
                        } else if (endMinutes >= m3 && endMinutes <= m4) {
                            return endMinutes - m1 - (m3 - m2);
                        } else {
                            return minutesPerDay;
                        }
                    } else if (startMinutes >= m1 && startMinutes <= m2) {
                        if (endMinutes >= m1 && endMinutes <= m2) {
                            return endMinutes - startMinutes;
                        } else if (endMinutes > m2 && endMinutes < m3) {
                            return m2 - startMinutes;
                        } else if (endMinutes >= m3 && endMinutes <= m4) {
                            return endMinutes - m3 + (m2 - startMinutes);
                        } else {
                            return m4 - m3 + (m2 - startMinutes);
                        }
                    } else if (startMinutes > m2 && startMinutes < m3) {
                        if (endMinutes > m2 && endMinutes < m3) {
                            return 0;
                        } else if (endMinutes >= m3 && endMinutes <= m4) {
                            return endMinutes - m3;
                        } else {
                            return m4 - m3;
                        }
                    } else if (startMinutes >= m3 && startMinutes <= m4) {
                        if (endMinutes >= m3 && endMinutes <= m4) {
                            return endMinutes - startMinutes;
                        } else {
                            return m4 - startMinutes;
                        }
                    } else {
                        return 0;
                    }
                } else {
                    System.out.println("开始时间和结束时间不在同一天,都为工作日");
                    int workDays = 0;  工作整天数
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(startTimeYYYYMMDD);
                    cal.add(Calendar.DAY_OF_MONTH, +1);
                    Date validStartTimeYYYYMMDD = cal.getTime();
                    while (validStartTimeYYYYMMDD.compareTo(endTimeYYYYMMDD) != 0) {
                        if (!isDayOff(validStartTimeYYYYMMDD, lawHolidayList, lawWorkList)) {
                            workDays += 1;
                        }
                        cal.add(Calendar.DAY_OF_MONTH, +1);
                        validStartTimeYYYYMMDD = cal.getTime();
                    }
                    System.out.println("工作整天数" + workDays);
                    if (startMinutes < m1) {
                        startWorkMinutes = minutesPerDay;
                    } else if (startMinutes >= m1 && startMinutes <= m2) {
                        startWorkMinutes = m4 - startMinutes - (m3 - m2);
                    } else if (startMinutes > m2 && startMinutes < m3) {
                        startWorkMinutes = m4 - m3;
                    } else if (startMinutes >= m3 && startMinutes <= m4) {
                        startWorkMinutes = m4 - startMinutes;
                    } else {
                        startWorkMinutes = 0;
                    }
                    System.out.println("开始时间当天的工作总分钟数startWorkMinutes:" + startWorkMinutes);
                    if (endMinutes < m1) {
                        endWorkMinutes = 0;
                    } else if (endMinutes >= m1 && endMinutes <= m2) {
                        endWorkMinutes = endMinutes - m1;
                    } else if (endMinutes > m2 && endMinutes < m3) {
                        endWorkMinutes = m2 - m1;
                    } else if (endMinutes >= m3 && endMinutes <= m4) {
                        endWorkMinutes = endMinutes - m1 - (m3 - m2);
                    } else {
                        endWorkMinutes = minutesPerDay;
                    }
                    System.out.println("结束时间的总分钟数" + endMinutes);
                    System.out.println("结束时间当天的工作总分钟数endWorkMinutes:" + endWorkMinutes);
                    return startWorkMinutes + endWorkMinutes + workDays * minutesPerDay;
                }
            }
        }
    }
    /*public static void main(String args[]) throws Exception {
        SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
        List<Date> lawHolidayDate = new ArrayList<>();
        List<Date> lawWorkDate = new ArrayList<>();
        String[] lawHolidayDateStr = new String[] { "2019-01-01", "2019-02-04", "2019-02-05", "2019-02-06",
                "2019-02-07", "2019-02-08", "2019-02-09", "2019-02-10", "2019-04-05", "2019-04-06", "2019-04-07",
                "2019-05-01", "2019-05-02", "2019-05-03", "2019-05-04", "2019-06-07", "2019-06-08", "2019-06-09",
                "2019-09-13", "2019-09-14", "2019-09-15", "2019-10-01", "2019-10-02", "2019-10-03", "2019-10-04",
                "2019-10-05", "2019-10-06", "2019-10-07" };
        String[] lawWorkDateStr = new String[] { "2019-02-02", "2019-02-03", "2019-04-28", "2019-05-05", "2019-09-29",
                "2019-10-12" };
        for (String str : lawHolidayDateStr) {
            lawHolidayDate.add(yyyyMMdd.parse(str));
        }
        for (String str : lawWorkDateStr) {
            lawWorkDate.add(yyyyMMdd.parse(str));
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date startDate = sdf.parse("2019-05-11 15:20:59");
        Date endDate = sdf.parse("2019-05-13 15:20:59");
        System.out.println("开始时间:" + sdf.format(startDate));
        System.out.println("结束时间:" + sdf.format(endDate));
        System.out.println("相差分钟数:" + workHours(startDate, endDate, lawHolidayDate, lawWorkDate));
    }*/
    
    public Long workMinutes(Date startDate,Date endDate) throws Exception {
        SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
        List<Date> lawHolidayDate = new ArrayList<>();
        List<Date> lawWorkDate = new ArrayList<>();
        String[] lawHolidayDateStr = new String[] { "2019-01-01", "2019-02-04", "2019-02-05", "2019-02-06",
                "2019-02-07", "2019-02-08", "2019-02-09", "2019-02-10", "2019-04-05", "2019-04-06", "2019-04-07",
                "2019-05-01", "2019-05-02", "2019-05-03", "2019-05-04", "2019-06-07", "2019-06-08", "2019-06-09",
                "2019-09-13", "2019-09-14", "2019-09-15", "2019-10-01", "2019-10-02", "2019-10-03", "2019-10-04",
                "2019-10-05", "2019-10-06", "2019-10-07" };
        String[] lawWorkDateStr = new String[] { "2019-02-02", "2019-02-03", "2019-04-28", "2019-05-05", "2019-09-29",
                "2019-10-12" };
        for (String str : lawHolidayDateStr) {
            lawHolidayDate.add(yyyyMMdd.parse(str));
        }
        for (String str : lawWorkDateStr) {
            lawWorkDate.add(yyyyMMdd.parse(str));
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        Date startDate = sdf.parse(strStartDate);
//        Date endDate = sdf.parse(strEndDate);
        System.out.println("开始时间:" + sdf.format(startDate));
        System.out.println("结束时间:" + sdf.format(endDate));
        long workHours = workHours(startDate, endDate, lawHolidayDate, lawWorkDate);
        System.out.println("相差分钟数:" + workHours);
        return workHours;
    }
}

~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值