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

废话不多说,上代码:

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

计算有效时长的截止工作时间相关推荐

  1. 【泛微表单】请假流程中计算请假时长(非系统自带考勤类型)

    请假流程计算请假时长 按一天8小时计算,日期为浏览按钮日期字段,时间为单选下拉框: <script> var beginTimeId = {id: "field22286&quo ...

  2. java 计算有效时长,有一时间段不计算时长

    java 计算有效时长,有一时间段不计算时长 计算时效性 计算 2020-08-07 10:10:23 到 2020-08-08 22:10:23 时间段内有多少小时,每天的01:00:00至06:0 ...

  3. Java计算请假时长(根据规则设置去除节假日、休息日、特殊日期)

    首先选择的日期要判断是不是节假日: 这里是写了工具类获取全年的日期信息. dateUtils工具类 某年第一天可以直接拼接 yyyy-01-01 获取节假日方法: public class DateU ...

  4. 根据采样频率计算音频时长

    基础知识: 采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数. 正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论(只有采样频率高于声音信号最高频率的两倍时, ...

  5. excel不显示0_【208期】根据身份证号计算退休年龄时长高亮提醒,EXCEL做到了

    导读 应亲们要求,以后会多上实例,今天给大家分享一期关于EXCEL根据身份证号以及退休年龄,动态自动计算距离到期年限,以及高亮提醒的实战案例. 实例要求: 根据身份证号以及退休年龄,用excel公式自 ...

  6. 根据文件大小和属性计算音频时长,详解

    可以根据一个 wav 文件的大小.采样频率和采样大小估算出一个 wav 文件的播放长度. 譬如 "Windows XP 启动.wav" 的文件长度是 424,644 字节, 它是 ...

  7. MySQL计算在线时长(超过2分钟未上传不在计算范围)

    根据上传时间进行统计,每隔一分钟上传一次数据,超过2分钟也就是120秒没有数据上传的话就不纳入计算范围,统计SQL如下: select t.driverId,t.sumTime,t.countDate ...

  8. N103_考虑周末及法定上班和休假日计算工作日时长

    import pandas as pd from chinese_calendar import is_workday # 构造测试数据 df = pd.DataFrame({'项目':['a', ' ...

  9. 活动时长计算尝试用Lambada 实现责任链的代码优化

    文章目录 活动时长计算尝试用Lambada 实现责任链的代码优化 原流程 原代码 主控流程 计算标准费率时长子过程 电访和面访活动计算标准费率时长 路演活动计算标准费率时长 问卷活动计算标准费率时长 ...

最新文章

  1. hibernate映射(单向双向的一对多、多对一以及一对一、多对一(转)
  2. 软件研发中的N条原则
  3. winform 自适应屏幕分辨率具体操作和注意事项
  4. 什么事计算机事实性知识,《人工智能》复习要点
  5. 实验报告:抽象数据类型的表现和实现
  6. Java基础---File类,就是这么简单
  7. Linus送出圣诞礼物:发布Linux 4.20,超35万行代码
  8. [冲啊!!!!!]小白SLAM相关基础知识
  9. HTML:雪碧图、高度塌陷和序号选择器
  10. 运放做跟随器有什么要求
  11. 【转载】红外遥控HS0038B接法
  12. 小程序开发商可以在哪里接项目订单/有几种接单方式
  13. 初学者如何快速搭建一个属于自己的网站
  14. 在地化和本土化的区别_本地化和翻译的本质区别在哪里?
  15. linux内核空间和用户空间认识和区别
  16. Java岗大厂面试百日冲刺【Day52】— 数据库8 (日积月累,每日三题)
  17. visual c 2008 php,十步之遥顺利升级到Visual Studio 2008
  18. 【教学类-07-04】20221113《破译电话号码-加减法版+自制(PDF打印)》(大班主题《我要上小学》)
  19. 垂杨柳中学2021年高考成绩查询时间,实力入选!朝阳这几所学校上榜啦丨校园直通车(2021年第4期)...
  20. 文本框”输入关键字 “提示

热门文章

  1. 继 CentOS 后,红帽又惹“众怒”:限制访问 RHEL 代码,要“杀死”下游发行版?...
  2. python正则_Python 正则表达式(转义问题)
  3. 为什么需要全屋净水,喝的水干净不就可以了?
  4. 算法作业系列10——Unique Substrings in Wraparound String
  5. 2020 MIT6.s081 XV6操作系统调试
  6. 【邵老师】大前端爱前端学习课程初中高级课程全套
  7. 九校联考-DL24 凉心模拟 Day2T1 锻造 (forging)
  8. 朴素贝叶斯 php,PHP实现机器学习之朴素贝叶斯算法详解.pdf
  9. winaip文档服务器已停止工作,win7运行office?excel已停止工作,退出时崩溃
  10. 最实用的必备电脑软件