计算工作日时间

计算指定时间间隔前的工作日时间点,其中的工作时间单独配置管理。

/**
     * 计算指定间隔时间(分钟)之前的工作时间,前提是传入的当前日期是工作日
     * 是否工作日由其它办法验证
     * @param limit 时隔时间(小时)
     * @return 返回工作日的一个时间点
     */
    public Date befor(int limitMinue,Calendar cur){
        WorkTime morningSession = workTimeService.getMorningSession();//工作日的上午
        WorkTime afternoonSession = workTimeService.getAfternoonSession();//工作日的下午
        
        int minues = cur.get(Calendar.HOUR_OF_DAY) * 60 + cur.get(Calendar.MINUTE);//当前时间
        
        if(minues < morningSession.getStartTime()
                || (minues >= morningSession.getEndTime() && minues < afternoonSession.getStartTime())
                || minues > afternoonSession.getEndTime()){
            //如果不在工作时间直接退出
            return null;
        }else{
            if(minues > afternoonSession.getStartTime()){//当前时间是下午
                int aftDur = minues - afternoonSession.getStartTime();//当前时间减去下午工作开始时间
                if(aftDur >= limitMinue){//剩余时间如果大于等于间隔时间表示还在下午工作时间
                    //标记点在下午
                    return computTime(cur,minues - limitMinue);
                }else{//当前时间减去间隔时间后时间点在上午
                    //标记点在上午
                    limitMinue -= aftDur;//减去下午时长
                    if(morningSession.duration() >= limitMinue){
                        //上午时间足够
                        return computTime(cur,morningSession.getEndTime() - limitMinue);
                    }else{
                        //如果上午时长不够,还要计算前一天时间
                        limitMinue -= morningSession.duration();//减去今天的时间
                        return preDay(cur, morningSession, afternoonSession,limitMinue);//计算前一天
                    }
                }
                
            }else{//当前时间是上午
                int morDur = minues - morningSession.getStartTime();
                
                if(morDur >= limitMinue){
                    //上午时间足够
                    return computTime(cur,minues - limitMinue);
                }else{
                    limitMinue -= morDur;
                    return preDay(cur, morningSession, afternoonSession,limitMinue);//计算前一天
                }
            }
        }
    }

    /**
     * 获取前一天时间点
     * @param cur
     * @param morningSession
     * @param afternoonSession
     * @param limitMinue
     * @return
     */
    private Date preDay(Calendar cur, WorkTime morningSession, WorkTime afternoonSession, int limitMinue) {
        int startMinue = 0;
        if(afternoonSession.duration() >= limitMinue){
            startMinue = afternoonSession.getEndTime() - limitMinue;
        }else{
            startMinue = morningSession.getEndTime() - (limitMinue - afternoonSession.duration());
        }
        while(true){
            cur.add(Calendar.DAY_OF_MONTH, -1);
            if(timeService.isWorkday(cur.getTime())){
                //如果是工作日退出循环
                break;
            }
        }
        return computTime(cur,startMinue);
    }

    private Date computTime(Calendar date,int minues){
        int houre = minues / 60;
        int minue = minues % 60;
        date.set(Calendar.HOUR_OF_DAY, houre);
        date.set(Calendar.MINUTE, minue);
        return date.getTime();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值