计算两个日期相差天数(除去一天中固定的时间段)



```java
public static void main(String[] args) throws ParseException {
        //System.out.println(getDate(DatetimeUtils.transferLongToDate(DEFAULT_DATE_TIME_FORMAT, null)));
        //Date a = DateToStringBeginOrEnd(new Date(),false);
        //System.out.println(a);
        String start = "2020-08-09 09:09:09";
        String end = "2020-08-09 10:20:09";
        Double durationH = getDurationH(start, end);
        System.out.println(durationH);
    }
    public static Double getDurationH(String start,String end) throws ParseException {
        // 8:00-----9:00---计时---->19:00------
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date startDate = simpleDateFormat.parse(start);
        Date endDate = simpleDateFormat.parse(end);

        Double intervalHours = getIntervalHours(startDate, endDate);
        Date date8Clock = getDateClock(start,8);

        Date startA = getDateClock(start,8);
        Date startB = getDateClock(start,20);
        Date endA = getDateClock(end,8);
        Date endB = getDateClock(end,20);
        Double duration = 0.0;
        //一、同一天
        if(sameDate(startDate,endDate)){

            if(startDate.before(startA)){// 1 startA在A
                if(endDate.before(endA)){
                    duration = 0.0;
                }else if((endA.before(endDate)||endA.getTime()==endDate.getTime())&&(endDate.before(endB)||endDate.getTime()==endB.getTime())){
                    duration = getIntervalHours(startA, endDate);
                }else if(endDate.after(endB)){
                    duration = 12.0;
                }
            }else if((startA.before(startDate)||startDate.equals(startA))&&(startDate.before(startB)||startDate.equals(startB))){ //2 start在B
                if(endDate.before(endA)){
                    duration = 0.0;
                }else if((endA.before(endDate)||endDate.equals(endA))&&(endDate.before(endB)||endB.equals(endDate))){
                    duration = getIntervalHours(startDate, endDate);
                }else if(endDate.after(endB)){
                    duration = getIntervalHours(startDate, startB);
                }
            }else if(startDate.after(endB)){//3 start在C
                duration = 0.0;
            }
        }else {// 二、不同一天
            if(getIntervalHours(startDate, endDate)>=24){//相差大于24小时,既为相隔时间大于1天,
                double duration0 = 0;
                double duration1 = 0;
                if(startDate.before((startA))){
                    //duration0 = 12*getIntervalHours(startDate, endDate)/24;
                    if(endDate.before(endA)){
                        duration =  12*(getIntervalHours(startDate, endDate)/24);
                    }else if((endDate.after(endA)||endDate.equals(endA))&&(endDate.before(endB)||endDate.equals(endB))){
                        duration = 12*(getIntervalHours(startDate, endDate)/24)+getIntervalHours(endA,endDate);
                    }else if(endDate.after(endB)){
                        duration = 12*(getIntervalHours(startDate, endB)/24)+12;
                    }
                }else if((startDate.after(startA)||startDate.equals(startA))&&(startDate.before(startB)||startDate.equals(startB))){
                    //duration1 = getIntervalHours(startDate,startB);
                    if(endDate.before(endA)){
                        duration0 =  12*getIntervalHours(startDate, endDate)/24 -(getIntervalHours(startA,startDate));
                    }else if((endDate.after(endA)||endDate.equals(endA)&&(endDate.after(endB)||endDate.equals(endB)))){
                        duration0 = 12*(getIntervalHours(startDate, endDate)/24)-(getIntervalHours(startA,startDate))+getIntervalHours(endA,endB)-getIntervalHours(endDate,endB);
                    }else if(endDate.after(endB)){
                        duration0 = 12*getIntervalHours(startDate, endDate)/24+12-(getIntervalHours(startA,startDate));
                    }
                    duration = duration1 + duration0;
                }else if(startDate.after(startB)){
                    if(endDate.before(endA)){
                        duration =  12*getIntervalHours(startDate, endDate)/24;
                    }else if(endDate.after(endA)&&endDate.before(endB)){
                        duration = 12*(getIntervalHours(startDate, endDate)/24)+getIntervalHours(endA,endDate);
                    }else if(endDate.after(endB)){
                        duration = 12*getIntervalHours(startDate, endDate)/24+12;
                    }
                }
            }else {// ---相隔一天...
                if(startDate.before(startA)){//1.
                    duration = 12.0;
                }else if(startDate.before(startB)&&startDate.after(startA)){
                    double duration1 = getIntervalHours(startDate,startB);
                    double duration2 = 0.0;
                    if(endDate.before(endA)){
                        duration2 = 0 ;
                    }else if(endDate.before(endB)&&endDate.after(endA)){
                        duration2 = getIntervalHours(endA,endDate);
                    }else if(endDate.after(endB)){
                        duration2 = getIntervalHours(endA,endB);// 12
                    }
                    duration = duration1+duration2;
                }else if(startDate.after(startB)){
                    if(endDate.before(endA)){
                        duration = 0.0;
                    }else if(endDate.after(endA)&&endDate.before(endB)){
                        duration = getIntervalHours(endA,endDate);
                    }else if(endDate.after(endB)){
                        duration = 12.0;// 12
                    }
                }
            }
        }
        boolean a = startA.before(endB); // 2020-08-10 08:00:00 在 2020-08-10 20:00:00 之前吗? true
        return Double.valueOf(duration);
    }
    public static Date getDateClock(String dateStr,int clock) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(dateStr);
        TimeZone curTimeZone = TimeZone.getTimeZone("GMT+8");
        Calendar c = Calendar.getInstance(curTimeZone);
        c.setTime(d);
        c.set(Calendar.HOUR_OF_DAY, clock);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        Date z = c.getTime();
        return z;
    }
     public static Double getIntervalHours(Date startDate, Date endDate) {
        long start = startDate.getTime();
        long end = endDate.getTime();
        // ((end - start) / ( 60 * 60 * 1000))*10
        double duration = Double.valueOf((end - start)) / ( 60 * 60 * 1000);
        return (double) Math.round(duration*10)/10;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值