java计算工作日(包含法定节假日和调休)
需要解决的两个问题:
- 怎么判断一个日期是否是工作日
- 怎么有法定节假日和调休的数据
思路:
- 通过 jdk 自带的 Calendar 类获取日期的星期值,按正常周一到周五5天计算工作日(法定节假日、调休额外判断,另加处理)
- 法定节假日和调休的日期数据可以手动维护在一个配置文件中,在程序中读取配置文件获取;但这样比较死板,每年的数据都会变化,这样每次都需要手动维护很不方便;改进下,使用第三方接口获取这些节假日数据,解析存储下来;这里使用天行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计算工作日(包含法定节假日和调休)相关推荐
- java节假日 调休的代码,java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...
1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取). 2.工具类代码 /** * @author: ...
- java获取法定节假日_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...
1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...
- java 获取假期时间_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...
1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...
- java 法定节假日_java 获取n个工做往后的日期(包含法定节假日、双休日、节后补班)...
1.说明:java 获取n个工做往后的日期(包含法定节假日.双休日.节后补班),须要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取)sql 2.工具类代码数据库 impor ...
- java计算工作日方法
java计算工作日,实测有效 public static Date getDate(Date currentDate, int days){Calendar calendar= Calendar.ge ...
- 获取下一个工作日/休息日的方法 本地基础搭建 Springboot 法定节假日/休息日/调休日 均可 不用调三方
场景 我们在一些特殊的业务场景下,想要获取到下一个工作日,这里的工作日指正常的法定工作日(包含调休日),这个需求来源于银联的提现,银联只能在法定工作日才能体现,那么在业务代码里对提现日期必须就是工作日 ...
- mysql查询 工作时间段 与 非工作时间段数据,包含法定节假日
要求:查询工作时间与非工作时间(工作时间:周一周五8:30-17:30,其他时间为非工作时间) 1. 查询工作时间SQL 说明:过滤条件为周1到周5(8:30-17:30) select crea ...
- Java 计算工作日,休假,调休,调班等
/*** 用于判断n个工作日(排除节假日.周六日包含节后补班数据)后的日期* @param list 节假日数据源* @param weekDayList 节后补班数据源* @param today ...
- [需求总结] 关于 Java 判断是否为工作日、法定节假日
应用场景 假设我有一个任务,任务一共需要 10 个小时就可以完成.任务开始时间是 2018-3-28,结束时间是 2018-4-8. 我们通过日历可以知道,3-31 和 4-1 是周末,然后 4月份的 ...
- java计算工作日_Java工作日计算工具类
工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...
最新文章
- linq调用mysql函数_如何为linq对象制作一个展平函数(Linq To Entities for mysql)?
- git清空工作区和暂存区
- 专访阿里云域名与网站业务总经理宋瑛桥:域名未来将更加个性化、生态化和规范化...
- android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备
- JAVA学习资料整理
- 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈
- 【转载】OpenStack Swift学习笔记
- 阿里工程师教你 3 分钟实现数据源编排和接入
- Excle 常用函数
- 绝地求生服务器维护6.28,绝地求生6月28号更新完怎么进不去 绝地求生更新维护到几点6.28...
- “华为杯”第十七届中国研究生数学建模竞赛2020 —— B题
- 数字化转型需要双模IT
- Echarts折线图动态获取数据实例(附java后台代码)
- 轻松使用Nginx搭建web服务器
- IOS 企业级苹果开发者账号申请流程
- 平安的互联网布局新探索 平安天下通引领金融服务再升级
- android 8三星note8,去年发布的三星Note8到底还值不值得买,三星Note8深度体验!!!...
- arcmap 多边形向外扩展100km并转化为json示例
- Linux下常用软件推荐列表
- 24/27/32寸电脑显示器尺寸多大?长宽多少厘米?显示屏长宽与面积的算法