```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;
}
}