Java计算加班时间,请假时间

package com.fiberhome.fibergen.util;



import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class MyDate {

    private static double amStartTime = 8.500;
    private static double amEndTime = 12.000;
    private static double pmStartTime = 14.000;
    private static double pmEndTime = 17.500;

    public static void main(String[] args) throws ParseException {
        String starttime="2021-03-20 11:00:10";
        String endtime="2021-03-20 12:30:10";

//        System.out.println(1.50/8.00);
//        double data =n.jisuan(starttime, endtime);
//        data = data * 8;
//        BigDecimal b = new BigDecimal(data);
//        data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//        System.out.println(data);
        Date startDate = DateUtils.parseDate(starttime);
        try {
            System.out.println(new MyDate().getOverWorkDays(starttime,endtime));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 计算请假时间
     * @param starttime
     * @param endtime
     * @return
     * @throws Exception
     */
    public double getDays(String starttime ,String endtime) throws Exception{
        double data = 0;
        data = jisuan(starttime, endtime);
        data = data * 8;
        BigDecimal b = new BigDecimal(data);
        data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return data;
    }

    public double jisuan(String s1 ,String s2) throws ParseException{
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1 = s.parse(s1);
        Date d2 = s.parse(s2);
        SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd");
        Date dd1 = ss.parse(s1);
        Date dd11 = ss.parse(s1);
        Date dd2 = ss.parse(s2);
//        System.out.println(dd1);
        Calendar ca = Calendar.getInstance();
        if(dd1.getTime()==dd2.getTime()){//同一天
            if(this.getweekdayloc(dd1,ca)==0){//星期天
                return 0;
            }else{
                return this.getshijian(d1,ca)) - this.getshijian(d2,ca);
            }
        }else{
            double bb=0.000;
            while(dd2.getTime()>=dd1.getTime()){
                if(this.getweekdayloc(dd1,ca)==1){
                    if(dd1.getTime()==dd11.getTime()){
                        bb+=this.getshijian(d1,ca);
                    }else if(dd1.getTime()==dd2.getTime()){
                        bb+=(1-this.getshijian(d2,ca));
                    }else{
                        bb+=1;
                    }
                }

                ca.setTime(d1);
                ca.add(Calendar.DATE, 1);
                d1=ca.getTime();
                ca.clear();
                ca.setTime(dd1);
                ca.add(Calendar.DATE, 1);
                dd1=ca.getTime();
//                System.out.println(bb);
            }

            return bb;
        }

    }


    //传进一个日期判断是否是周六、日    。六日返回0,其他返回1
    private int getweekdayloc(Date date,Calendar ca){
        ca.setTime(date);
        if(ca.get(Calendar.DAY_OF_WEEK)==1 || ca.get(Calendar.DAY_OF_WEEK)==7){
            return 0;
        }else{
            return 1;
        }

    }
    //判断
    private double getshijian(Date date,Calendar ca){
        ca.setTime(date);
        int shi = ca.get(Calendar.HOUR_OF_DAY);
        int fen = ca.get(Calendar.MINUTE);
        double d = shi+fen/60.000;
        if(shi<amStartTime){
            return 1.000;
        }else if(d<=amEndTime && d>=amStartTime){
            return (amEndTime-d+(pmEndTime-pmStartTime))/8;
        }else if(d>amEndTime && d<pmStartTime){
            return (pmEndTime-pmStartTime)/8;
        }else if(d>=pmStartTime&& d<=pmEndTime){
            return (pmEndTime-d)/8;
        }else{
            return 0.000;
        }
    }

    /**
     *
     * @param startTime
     * @param endTime
     * @param flag flag按照二进制位数分别为00(0两个都在周末),01(1开始在,结尾不在),10(2,开始不在,结尾在),11(3,两个都不在)
     * @return
     */
    public double getOverWorkDays(Date startTime, Date endTime,int flag,boolean ifSameDay) {
       double data = 0.0;
        //1,当天下午至当天晚上
        Calendar endInstance = Calendar.getInstance();
        endInstance.setTime(endTime);

        Calendar startInstance = Calendar.getInstance();
        startInstance.setTime(startTime);

        int endHours = endInstance.get(Calendar.HOUR_OF_DAY);
        int intStart = startInstance.get(Calendar.HOUR_OF_DAY) +startInstance.get(Calendar.MINUTE)/60;
        int ineEnd = endInstance.get(Calendar.HOUR_OF_DAY) +endInstance.get(Calendar.MINUTE)/60;
        if(ifSameDay ){
            if(flag == 3){
                if(intStart <= pmEndTime) resetStartTime(startInstance);
            }else{}
        }else{
            if(flag == 3){
                if(intStart <= pmEndTime) resetStartTime(startInstance);
                if(ineEnd >= amStartTime) resetEndTime(endInstance);
            }
        }
        data =  (endInstance.getTime().getTime() - startInstance.getTime().getTime())/1000.0/3600.0;
        /*if(intStart >= pmEndTime){//在下班之后
        }else{//在下班之前,强制置为下班时间
            data =  (endTime.getTime() - startInstance.getTime().getTime())/1000.0/3600.0;
        }*/
        //2,当天下午至第二天早上
        BigDecimal b = BigDecimal.valueOf(data);
        data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return  data;
        //3,双休
    }

    private void resetStartTime(Calendar startInstance) {
        startInstance.set(Calendar.HOUR_OF_DAY,17);
        startInstance.set(Calendar.MINUTE,30);
        startInstance.set(Calendar.SECOND,0);
    }
    private void resetEndTime(Calendar endInstance) {
        endInstance.set(Calendar.HOUR_OF_DAY,8);
        endInstance.set(Calendar.MINUTE,30);
        endInstance.set(Calendar.SECOND,0);
    }
    /**
     * 计算加班时间
     * @param s1
     * @param s2
     * @return
     * @throws Exception
     */
    public double getOverWorkDays(String s1, String s2) throws Exception{
        double data = 0.0;
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1 = s.parse(s1);
        Date d2 = s.parse(s2);
        SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd");
        Date dd1 = ss.parse(s1);
        Date dd11 = ss.parse(s1);
        Date dd2 = ss.parse(s2);
        Calendar ca = Calendar.getInstance();
        if(dd1.getTime()==dd2.getTime()){//同一天
            if(this.getweekdayloc(dd1,ca)==0){//周末
                data =  (d2.getTime() - d1.getTime())/1000.0/3600.0;
            }else{
                return getOverWorkDays(d1,d2,3,true);
            }
        }else{//不同天
            if(this.getweekdayloc(dd1,ca)==0 &&this.getweekdayloc(dd2,ca)==0  ){//首尾都是周末
                data =  (d2.getTime() - d1.getTime())/1000.0/3600.0;
            }else if (this.getweekdayloc(dd1,ca)!=0 &&this.getweekdayloc(dd2,ca)!=0  ){
                return getOverWorkDays(d1,d2,3,false);
            }
        }

        BigDecimal b = BigDecimal.valueOf(data);
        data = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return  data;
    }


}



中间还有剩余的判断,留待你们自己去处理逻辑,比较粗糙,还请各位大佬多多指教

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值