计算请假时间(不算节假日)

//计算小时数
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Double hours= HolidayDateUtil.calculateTimeHour(format.format(leave.getStart_time()),format.format(leave.getEnd_time()),"08:00:00","11:30:00","13:00:00","17:30:00");
Double day=0.0;
//计算半天
if(leave.getStart_time().getHours()<12){
    if(hours<=3.5){
        day=0.5;
    }else if(hours>3.5&&hours<=8){
        day=1.0;
    }else{
        day=Math.ceil(hours/8);
    }
}else{
    if(hours<=4.5){
        day=0.5;
    }else if(hours>4.5&&hours<=8){
        day=1.0;
    }else{
        day=Math.ceil(hours/8);
    }
}
leave.setDays(day);
leave.setCreate_user_id(userId);
leave.setCreate_user_name(userName);
int count = leaveMapper.add(leave);
if(count < 0 ){
    return RTN.rtn501("添加数据失败!");
}

------------------------------------------------------------------------------------------------------------------------------

HolidayDateUtil 放在util里
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 请假计算(小时)
 * 1.除去 节假日
 * 2.除去 其他规定的 非工作时间(有具体的  实行者指定)
 * 3.考虑一点 其他不上班时间 有些公司的特别
 * @author fengjing
 *
 */
public class HolidayDateUtil {

    /**
     * 节假日查询接口
     * 使用方法 url+yyyyMMdd
     */


//时间格式化
    public final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public final static SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");

//    /**
//     * 从公认网站上获取 节假日信息
//     * @param date 获取节假日的 公认网站 url="网站地址"+时间 时间格式yyyyMMdd
//     * @param
//     * @return 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2, 网站失效-1, 数据格式改变-2
//     */
//    public static String getHoliday(String date) {
//        ChineseCalendarUtils cc = new ChineseCalendarUtils();
//        try {
//            return cc.checkDate(date);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;
//    }

    /**
     * 判断某年某月有多少天
     * @param year 年  "yyyy"
     * @param moun 月 "m"
     * @return
     */
    public static int daysMonth(int year,int moun){
        switch(moun){
            case 0: return 31;
            case 1: return ((year%4==0&&year%100!=0)||year%400==0)?29:28;
            case 2: return 31;
            case 3: return 30;
            case 4: return 31;
            case 5: return 30;
            case 6: return 31;
            case 7: return 31;
            case 8: return 30;
            case 9: return 31;
            case 10: return 30;
            case 11: return 31;
            default: return 0;
        }
    }
    /**
     * 通过时间秒毫秒数判断两个时间的间隔
     * @param tiny 开始时间
     * @param large 结束时间
     * @return 返回几天
     */
    public static int differentDaysByMillisecond(Date tiny,Date large){
        if(format1.format(tiny).equals(format1.format(large))){
            return 0;
        }
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(tiny);
        c2.setTime(large);
        int result = c2.get(Calendar.DAY_OF_YEAR) - c1.get(Calendar.DAY_OF_YEAR);
    /*Double why = Double.valueOf((large.getTime() - tiny.getTime()))/(1000*3600*24);
    double d = Math.ceil(why);*/
        return result;
    }

    /**
     * 通过时间秒毫秒数判断两个时间的间隔
     * @param tiny 开始时间
     * @param large 结束时间
     * @return 返回几小时
     */
    public static double differentHoursByMillisecond(Date tiny,Date large){
        double hours = ((double) ((large.getTime() - tiny.getTime())) / (1000*3600));
        return hours;
    }

    /**
     * 时间格式yyyy-MM-dd HH:mm:ss
     * @param start 请假开始时间 yyyy-MM-dd HH:mm:ss
     * @param end 请假结束时间 yyyy-MM-dd HH:mm:ss
     * @param startM 上班早晨开始时间 HH:mm:ss
     * @param endE   上班早晨结束时间 HH:mm:ss
     * @param startAf 上班下午开始时间 HH:mm:ss
     * @param endAf      上班下午结束时间 HH:mm:ss
     * @return
     */
    public static double calculateTimeHour(String start, String end, String startM, String endE, String startAf, String endAf){
        if(start!=null&&end!=null&&startM!=null&&endE!=null&&startAf!=null&&endAf!=null){//确保时间格式正确和值存在
            try {
                Date dataStart =cn.waifutong.supplyChain.util.HolidayDateUtil.format.parse(start);
                Date dataEnd = cn.waifutong.supplyChain.util.HolidayDateUtil.format.parse(end);

                double hours = 0;
                int monthDays = -1;
                int yearTime = dataStart.getYear()+1900;
                int mounthTime = dataStart.getMonth();
                int dataTime = dataStart.getDate();

                double lunchBreak;
                int interval = cn.waifutong.supplyChain.util.HolidayDateUtil.differentDaysByMillisecond(dataStart,dataEnd);

                //判断这年这月有多少天
                monthDays = HolidayDateUtil.daysMonth(yearTime,mounthTime);
                //第一天请假开始时间
                String startday = start.substring(start.lastIndexOf(" ")+1,start.length()-1);
                //最后一天请假结束时间
                String endday = end.substring(end.lastIndexOf(" ")+1,end.length()-1);
                double totalDay = 0;//累积总共请假多少天
                for(int i=0;i<=interval;i++){
                    if(interval==0){//间隔0天 也就是 请假在一天之内
//                        if(!"0".equals(HolidayDateUtil.getHoliday(yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>10?dataTime:"0"+dataTime)))){
//                            System.out.println(""+yearTime+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+(dataTime>10?dataTime:"0"+dataTime)+"非工作日期不需要计算");
//                            return 0;
//                        }
                        String s = start.substring(0,10)+" "+endE;
                        String s1 = start.substring(0,10)+" "+startAf;
                        String s2 = start.substring(0,10)+" "+startM;
                        String s3 = start.substring(0,10)+" "+endAf;
                        Date dataMorning = HolidayDateUtil.format.parse(s2);
                        Date dataAfternoon = HolidayDateUtil.format.parse(s3);
                        Date dataCenter1 = HolidayDateUtil.format.parse(s);
                        Date dataCenter2 = HolidayDateUtil.format.parse(s1);
                        //开始时间在9点前 结束时间:①9点前 ②9点到12点 ③12点到1点 ④1点到6点 ⑤6点后
                        if(dataStart.compareTo(dataMorning) <= 0){
                            if(dataEnd.compareTo(dataMorning) <= 0){
                                hours = 0;
                                lunchBreak = 0;
                            }else if(dataEnd.compareTo(dataMorning) > 0 && dataEnd.compareTo(dataCenter1) <= 0){
                                hours = differentHoursByMillisecond(dataMorning,dataEnd);
                                lunchBreak = 0;
                            }else if(dataEnd.compareTo(dataCenter1) > 0 && dataEnd.compareTo(dataCenter2) <= 0){
                                hours = differentHoursByMillisecond(dataMorning,dataCenter1);
                                lunchBreak = 0;
                            }else if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){
                                hours = differentHoursByMillisecond(dataMorning,dataEnd);
                                lunchBreak = 1;
                            }else{
                                hours = 8;
                                lunchBreak = 0;
                            }
                        }
                        //开始时间在9点到12点 结束时间:②9点到12点 ③12点到1点 ④1点到6点 ⑤6点后
                        else if(dataStart.compareTo(dataMorning) > 0 && dataStart.compareTo(dataCenter1) <= 0){
                            if(dataEnd.compareTo(dataMorning) > 0 && dataEnd.compareTo(dataCenter1) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = 0;
                            }else if(dataEnd.compareTo(dataCenter1) > 0 && dataEnd.compareTo(dataCenter2) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = differentHoursByMillisecond(dataCenter1,dataEnd);
                            }else if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = 1;
                            }else{
                                hours = differentHoursByMillisecond(dataStart,dataAfternoon);
                                lunchBreak = 1;
                            }
                        }
                        //开始时间在12点到1点 结束时间:③12点到1点 ④1点到6点 ⑤6点后
                        else if(dataStart.compareTo(dataCenter1) > 0 && (dataStart.compareTo(dataCenter2)) <= 0){
                            if(dataEnd.compareTo(dataCenter1) > 0 && dataEnd.compareTo(dataCenter2) <= 0){
                                hours = 0;
                                lunchBreak = 0;
                            }else if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){
                                hours = differentHoursByMillisecond(dataCenter2,dataEnd);
                                lunchBreak = 0;
                            }else{
                                hours = differentHoursByMillisecond(dataStart,dataAfternoon);
                                lunchBreak = differentHoursByMillisecond(dataStart,dataCenter2);
                            }
                        }
                        //开始时间在1点到6点 结束时间: ④1点到6点 ⑤6点后
                        else if(dataStart.compareTo(dataCenter2) >0 && dataStart.compareTo(dataAfternoon) <= 0){
                            if(dataEnd.compareTo(dataCenter2) > 0 && dataEnd.compareTo(dataAfternoon) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = 0;
                            }else{
                                hours = differentHoursByMillisecond(dataStart,dataAfternoon);
                                lunchBreak = 0;
                            }
                        }
                        //开始时间在6点后
                        else{
                            hours = 0;
                            lunchBreak = 0;
                        }


                    }else{//间隔超过一天
                        dataTime +=(i==0?0:1);
                        if(dataTime>monthDays){
                            mounthTime ++;
                            dataTime=1;
                            if(mounthTime>11){
                                yearTime++;
                                mounthTime=0;
                                dataTime=1;
                            }
                            monthDays = HolidayDateUtil.daysMonth(yearTime,mounthTime);
                        }

                        //判断是否是节假日
//                        if(!"0".equals(HolidayDateUtil.getHoliday(yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>10?dataTime:"0"+dataTime)))){
//                            System.out.println(""+yearTime+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+(dataTime>10?dataTime:"0"+dataTime)+"非工作日期不需要计算");
//                            continue;
//                        }
                        String s1 = yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>=10?dataTime:"0"+dataTime)+" "+(i==0?startday:startM);
                        String s2 = yearTime+"-"+(((mounthTime+1))>=10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>=10?dataTime:"0"+dataTime)+" "+(i==interval?endday:endAf);
                        Date dateMorning = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+startM);
                        Date dateAfternoon = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+endAf);
                        Date dateCenter1 = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+endE);
                        Date dateCenter2 = HolidayDateUtil.format.parse(s1.substring(0,10)+" "+startAf);
                        dataStart = HolidayDateUtil.format.parse(s1);
                        dataEnd = HolidayDateUtil.format.parse(s2);
                        //第一天 dataEnd为6点 判断开始时间 ①9点前 ②9点到12点 ③12点到1点 ④ 1点到6点 ⑤ 6点之后
                        if(i == 0){
                            if(dataStart.compareTo(dateMorning) <= 0){
                                hours = 8;
                                lunchBreak = 0;
                            }else if(dataStart .compareTo(dateMorning) > 0 && dataStart.compareTo(dateCenter1) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = 1;
                            }else if(dataStart.compareTo(dateCenter1) > 0 && dataStart.compareTo(dateCenter2) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = differentHoursByMillisecond(dateCenter1,dataStart);
                            }else if(dataStart.compareTo(dateCenter2) > 0 && dataStart.compareTo(dateAfternoon) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = 0;
                            }else{
                                hours = 0;
                                lunchBreak = 0;
                            }
                            //中间天 hours 为8 lunchBreak为0
                        }else if( i != 0 && i != interval){
                            hours = 8;
                            lunchBreak = 0;
                            //最后一天 dataStart为9点 判断结束时间 ①9点前 ②9点到12点 ③12点到1点 ④ 1点到6点 ⑤ 6点之后
                        }else{
                            if(dataEnd.compareTo(dateMorning) <= 0){
                                hours = 0;
                                lunchBreak = 0;
                            }else if(dataEnd .compareTo(dateMorning) > 0 && dataEnd.compareTo(dateCenter1) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = 0;
                            }else if(dataEnd.compareTo(dateCenter1) > 0 && dataEnd.compareTo(dateCenter2) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = differentHoursByMillisecond(dateCenter1,dataEnd);
                            }else if(dataEnd.compareTo(dateCenter2) > 0 && dataEnd.compareTo(dateAfternoon) <= 0){
                                hours = differentHoursByMillisecond(dataStart,dataEnd);
                                lunchBreak = 1;
                            }else{
                                hours = 8;
                                lunchBreak = 0;
                            }
                        }
                    }
                    System.out.println(yearTime+"-"+(((mounthTime+1))>10?(mounthTime+1):"0"+(mounthTime+1))+"-"+(dataTime>10?dataTime:"0"+dataTime)+" 请假:"+(hours-lunchBreak)+"小时");
                    totalDay+=hours-lunchBreak;
                }
                System.out.println(totalDay);
                return totalDay;
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return -1;
    }

    /**
     * 累积请假共多少天
     * @param totalDay
     * @return totalDay < 24小时按小时算   totalDay >= 24小时按天算
     */
    public String totalDay(double totalDay){
        if(totalDay > 24){
            return (totalDay/24) + "天";
        }else{
            return totalDay + "小时";
        }
    }

    public static void main(String args[]) throws IOException{
        HolidayDateUtil qj= new HolidayDateUtil();
        //测试
//        qj.calculateTimeHour("2019-10-01 09:00:00","2019-10-03 12:00:00","08:00:00","11:30:00","13:00:00","17:30:00");
//       qj.calculateTimeHour("2019-10-01 07:30:00","2019-10-01 22:00:00","00:00:00","08:00:00","17:30:00","24:00:00");

    }
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值