计算有效时长的截止工作时间

最近做项目有个需求,计算有效时长的结束时间,这个结束时间点必须落在工作时间段之内

废话不多说,上代码:

    这里解释一下: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:00length == 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);
    }
}

猜你喜欢

转载自blog.csdn.net/wera0601/article/details/80785674