需要解决的两个问题:

  1. 怎么判断一个日期是否是工作日
  2. 怎么有法定节假日和调休的数据

思路:

  1. 通过 jdk 自带的 Calendar 类获取日期的星期值,按正常周一到周五5天计算工作日(法定节假日、调休额外判断,另加处理)
  2. 法定节假日和调休的日期数据可以手动维护在一个配置文件中,在程序中读取配置文件获取;但这样比较死板,每年的数据都会变化,这样每次都需要手动维护很不方便;改进下,使用第三方接口获取这些节假日数据,解析存储下来;这里使用天行API的节假日接口

实现:

@Component
public class ComputeWorkingDayUtil {//定义两个List,一个存放节假日日期,另一个存放调休的工作日期private static List<String> HOLIDAY_LIST = new ArrayList<>();private static List<String> SPECIAL_WORKDAY_LIST = new ArrayList<>();//静态代码块内调用第三方接口拿到数据存进List中static {Map<String, Object> param = new HashMap<String, Object>() {{put("key", "");//这里key值是注册天行API账号是给的put("type", 1);}};//获取当前年份,循环调用3次,拿到3年的数据int currentYear = Calendar.getInstance().get(Calendar.YEAR);for (int i=0; i<3; i++) {param.put("date", currentYear - i);String url = "http://api.tianapi.com/jiejiari/index";String response = HttpUtil.get(url, param);JSONObject resObj = JSONUtil.parseObj(response);int code = (int) resObj.get("code");if (code == 200) {JSONArray newslist = (JSONArray) resObj.get("newslist");for (Object listObj : newslist) {JSONObject obj = (JSONObject) listObj;String holidays = (String) obj.get("vacation");String[] holidayArray = holidays.split("\\|");HOLIDAY_LIST.addAll(Arrays.asList(holidayArray));String remark = (String) obj.get("remark");if (StringUtils.isNotEmpty(remark)) {String[] special = remark.split("\\|");SPECIAL_WORKDAY_LIST.addAll(Arrays.asList(special));}}}}}//计算工作日数的方法public static int computeWorkingDays(Date start, Date end) {Calendar startCal = Calendar.getInstance();Calendar endCal = Calendar.getInstance();startCal.setTime(start);endCal.setTime(end);int workDays = 0;//如果没有严格按照起始结束时间传值,在这里纠正下,可以注释掉if (startCal.getTimeInMillis() > endCal.getTimeInMillis()) {startCal.setTime(end);endCal.setTime(start);}while (startCal.getTimeInMillis() <= endCal.getTimeInMillis()) {//控制台打印出来循环情况,方便查看System.out.println(DateUtil.format(startCal.getTime(), "yyyy-MM-dd") + "   " + DateUtil.format(endCal.getTime(), "yyyy-MM-dd"));String current = DateUtil.format(startCal.getTime(), "yyyy-MM-dd");int dayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);if (dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY)           {if (!HOLIDAY_LIST.contains(current)) {System.out.println(true);workDays++;}}if (SPECIAL_WORKDAY_LIST.contains(current)) {System.out.println(true);workDays++;}startCal.add(Calendar.DATE, 1);}return workDays;}
}

把方法定义在工具类中,带上@Component注解,在SpringBoot项目中,项目启动时会扫描到这个类,同时创建其实例,随即静态代码块就会执行获取到节假日和调休的数据,数据存储在两个静态的List集合中,只要服务不停,整个生命周期内都有效,这样就免去了手动维护的工作

java计算工作日(包含法定节假日和调休)相关推荐

  1. java节假日 调休的代码,java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取). 2.工具类代码 /** * @author: ...

  2. java获取法定节假日_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...

  3. java 获取假期时间_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...

  4. java 法定节假日_java 获取n个工做往后的日期(包含法定节假日、双休日、节后补班)...

    1.说明:java 获取n个工做往后的日期(包含法定节假日.双休日.节后补班),须要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取)sql 2.工具类代码数据库 impor ...

  5. java计算工作日方法

    java计算工作日,实测有效 public static Date getDate(Date currentDate, int days){Calendar calendar= Calendar.ge ...

  6. 获取下一个工作日/休息日的方法 本地基础搭建 Springboot 法定节假日/休息日/调休日 均可 不用调三方

    场景 我们在一些特殊的业务场景下,想要获取到下一个工作日,这里的工作日指正常的法定工作日(包含调休日),这个需求来源于银联的提现,银联只能在法定工作日才能体现,那么在业务代码里对提现日期必须就是工作日 ...

  7. mysql查询 工作时间段 与 非工作时间段数据,包含法定节假日

    要求:查询工作时间与非工作时间(工作时间:周一周五8:30-17:30,其他时间为非工作时间) 1. 查询工作时间SQL   说明:过滤条件为周1到周5(8:30-17:30) select crea ...

  8. Java 计算工作日,休假,调休,调班等

    /*** 用于判断n个工作日(排除节假日.周六日包含节后补班数据)后的日期* @param list 节假日数据源* @param weekDayList 节后补班数据源* @param today ...

  9. [需求总结] 关于 Java 判断是否为工作日、法定节假日

    应用场景 假设我有一个任务,任务一共需要 10 个小时就可以完成.任务开始时间是 2018-3-28,结束时间是 2018-4-8. 我们通过日历可以知道,3-31 和 4-1 是周末,然后 4月份的 ...

  10. java计算工作日_Java工作日计算工具类

    工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...

最新文章

  1. linq调用mysql函数_如何为linq对象制作一个展平函数(Linq To Entities for mysql)?
  2. git清空工作区和暂存区
  3. 专访阿里云域名与网站业务总经理宋瑛桥:域名未来将更加个性化、生态化和规范化...
  4. android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备
  5. JAVA学习资料整理
  6. 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈
  7. 【转载】OpenStack Swift学习笔记
  8. 阿里工程师教你 3 分钟实现数据源编排和接入
  9. Excle 常用函数
  10. 绝地求生服务器维护6.28,绝地求生6月28号更新完怎么进不去 绝地求生更新维护到几点6.28...
  11. “华为杯”第十七届中国研究生数学建模竞赛2020 —— B题
  12. 数字化转型需要双模IT
  13. Echarts折线图动态获取数据实例(附java后台代码)
  14. 轻松使用Nginx搭建web服务器
  15. IOS 企业级苹果开发者账号申请流程
  16. 平安的互联网布局新探索 平安天下通引领金融服务再升级
  17. android 8三星note8,去年发布的三星Note8到底还值不值得买,三星Note8深度体验!!!...
  18. arcmap 多边形向外扩展100km并转化为json示例
  19. Linux下常用软件推荐列表
  20. 24/27/32寸电脑显示器尺寸多大?长宽多少厘米?显示屏长宽与面积的算法

热门文章

  1. 英伟达显卡虚拟化vGPU实践指南
  2. 视频采集站-免费视频资源采集工具-免费视频资源网采集
  3. 学计算机每天应该吃什么,一日三餐教电脑族缓解眼痛
  4. 安装kubernetes k8s v1.16.0 国内环境
  5. RTI_DDS使用参与者QoS属性编辑传输TCP
  6. 1.2.3 SPF计算过程
  7. 扩展YouTube视频频道,提高业务增量
  8. 陕西省咸阳市谷歌高清卫星地图下载
  9. MSP MCU I2C入门指南
  10. perl脚本基础总结(转)