最近做项目有个需求,计算有效时长的结束时间,这个结束时间点必须落在工作时间段之内
废话不多说,上代码:
这里解释一下:getduration是主方法:传递四个参数,第一个当前时间,第二个有效时长,第三个第四个是上下班时间。
三四两个参数不传默认是从0:00~24:00.本程序调用了全国节假日的接口。实现思路大体如下,构建一个年月日日期字符串,这个字符串是查询全国节假日接口的入参,firstTimeDay 上班时间,lastTimeDay下班时间,当为节假日的时候,当前时间变为次日的上班时间,递归调用getduration方法,当为上班日的时候,当前时间+有效时长 大于 下班时间的情况,当前时间变为次日的上班时间,有效时长=有效时长+下班时间-当前时间,再次递归调用;当前时间+有效时长小于下班时间。返回结果,结果为当前时间+有效时长,程序至此结束。这里还有一点没有实现,就是中午的休息时间没有剔除,留给聪明的你去改进完善吧。
package cn.vpclub.mcs.tyanhelp.admin.util; import cn.vpclub.moses.utils.common.DateUtil; import cn.vpclub.moses.utils.common.JsonUtil; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * Created by dell on 2018/6/23. */ public class HolidayUtil { /** * 获取节假日信息 * * @param params length = 2 参数依次为,当前时间,时长,后面两个字段不传默认是从0:00~24:00;length == 4,当前开始时间,时长,工作日上班时间,工作日下班时间 * @return */ private static Long getduaration(Long... params) { if (null != params) { Date date = new Date(params[0]); String dateStr = DateUtil.formatDate(date, DateUtil.YEARMONTHDAY); Date firstTimeOfDay = DateUtil.getFirstTimeOfDay(date); Date lastTimeOfDay = DateUtil.getLastTimeOfDay(date); if (params.length == 2) { //开始时间,时长 } else if (params.length == 4) {//开始时间,时长,有效工作时间段 firstTimeOfDay = new Date(firstTimeOfDay.getTime() + params[2]); lastTimeOfDay = new Date(firstTimeOfDay.getTime() + params[3]-params[2]); } //前提必须是当前天是工作日 if (getHoliDay(dateStr)) { if (params[0] + params[1] <= lastTimeOfDay.getTime()) { return params[0] + params[1]; } else { params[1] = params[1] - lastTimeOfDay.getTime() + params[0]; params[0] = DateUtil.addDay(firstTimeOfDay,1).getTime(); return getduaration(params); } }else { params[0] = DateUtil.addDay(firstTimeOfDay,1).getTime(); return getduaration(params); } } else { return 0L; } } private static Boolean getHoliDay(String dateStr) { Boolean isResult = false; Map<String, String> map = new HashMap<>(); map.put("date", dateStr); try { Map holidayMap = JsonUtil.jsonToMap(HttpClientUtil.doGet("http://api.goseek.cn/Tools/holiday", map)); if (null != holidayMap && holidayMap.get("data").equals(0)) { isResult = true; } } catch (Exception e) { } return isResult; } public static void main(String[] args) { Date date = new Date(); Long duraTime = 8L * 3600 * 1000 * 6; Long startTime = 9L * 3600 * 1000; Long endTime = 17L * 3600 * 1000; Date endDate = new Date(getduaration(new Long[]{date.getTime(),duraTime,startTime,endTime})); System.out.println(date+"-"+endDate); } }