根据开始时间结束时间,计算工作日的天数
整理了一下,感觉第三方的接口不是很稳定,欢迎提供新的接口地址
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * @author: DevanYan * @create: 2019-06-10 10:52 */ //工作时长计算工具 public class WorkDayUtil { private static final String API_URL = "http://api.goseek.cn/Tools/holiday?date="; private static final int WORK_STARK = 9; private static final int WORK_STOP = 18; /** * * @param beginDateTime 开始时间 * @param endDateTime 结束时间 * @return 时长(单位:天,最小计数单位:0.5) */ public static double workDays(LocalDateTime beginDateTime,LocalDateTime endDateTime){ double workDays = 0; LocalDate beginDate = LocalDate.of(beginDateTime.getYear(),beginDateTime.getMonth(),beginDateTime.getDayOfMonth()); LocalDate endDate = LocalDate.of(endDateTime.getYear(),endDateTime.getMonth(),endDateTime.getDayOfMonth()); Long days =Math.abs(beginDate.toEpochDay()-endDate.toEpochDay()); int beginHour = Integer.valueOf(beginDateTime.format(DateTimeFormatter.ofPattern("HH"))); int endHour = Integer.valueOf(endDateTime.format(DateTimeFormatter.ofPattern("HH"))); if( beginDate.toString().equals(endDate.toString()) ){//同一天 if(WorkDayUtil.isWorkDay(beginDate)){ if( ( beginHour>= WORK_STARK && endHour >= WORK_STARK && beginHour <= 12 && endHour <= 12) || ( beginHour > 12 && endHour > 12 && beginHour <= WORK_STOP && endHour <= WORK_STOP) ){ workDays = 0.5; }else{ workDays = 1; } }else{ workDays = 0; } }else{//跨天 LocalDate dealDate = beginDate; for(int i = 0;i<days-1;i++){ dealDate = dealDate.minusDays(-1); if(WorkDayUtil.isWorkDay(dealDate)){ workDays++; } } //第一天 if(WorkDayUtil.isWorkDay(beginDate)){ if(beginHour>12 ){ if(beginHour <= WORK_STOP){ workDays = workDays + 0.5; } }else{ workDays ++; } } //末天 if(WorkDayUtil.isWorkDay(endDate)){ if(endHour <= 12){ workDays = workDays + 0.5; }else{ workDays ++; } } } return workDays; } public static boolean isWorkDay(LocalDate date){ String dayStr = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")); int flag = WorkDayUtil.apiGet(dayStr); if(flag == 0 || flag == 2){ return true; } return false; } /** * @param dateStr * @return 正常工作日对应结果为 0, 法定节假日对应结果为 1, 节假日调休补班对应的结果为 2,休息日对应结果为 3 */ public static int apiGet( String dateStr) { String httpUrl= API_URL + dateStr; BufferedReader reader = null; String result = null; StringBuffer sbf = new StringBuffer(); int d = 0; try { URL url = new URL(httpUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.connect(); InputStream is = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));String strRead = null; while ((strRead = reader.readLine()) != null) { sbf.append(strRead); } reader.close(); result = sbf.toString(); result = result.trim(); System.out.println(result); if(result.indexOf("10000")!=-1){ result = result.substring(result.indexOf(":")+1); result = result.substring(result.indexOf(":")+1); result = result.substring(0,result.length()-1); d = Integer.valueOf(result); } } catch (Exception e) { e.printStackTrace(); } return d; } public static void main(String[] args) { LocalDateTime begin = LocalDateTime.parse("2019-06-01 09:00:00",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); LocalDateTime end = LocalDateTime.parse("2019-06-14 11:00:00",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println("工作日:"+WorkDayUtil.workDays(begin,end) +"天"); } }