工作日节假日调休日休息日的判断API-holiday
工作日节假日调休日休息日的判断API-holiday
1. 背景
从2019年开始接一个需求,调单设置超期反馈时间T+2及邮件发送时间T+1都需要排除休息日;之前一个接口http://api.goseek.cn/ 是可以获取到全年每一天的性质四种<后续介绍>;但是2020年需要更新数据了,这个页面就打不开了,开始想法自己实现,并想做成静态工具类。
2. 设计思路
若没有节假日,则只分为工作日和周末;国务院每年11或12月份公布下一年的节假日及调休日;由于这些日子比较少且是固定的,因此只需要将这些保存下来,通过代码逻辑就可以判断出一年中每一天的性质。
性质分成四种:
# 某一天的性质分成四种:# 0. 正常工作日为0,Weekday# 1. 正常周六日为1,Weekend# 2. 法定节假日为2,holiday# 3. 周六日调休补班为3,makeUp4Rest
政府网: http://www.gov.cn/zhengce/content/2019-11/21/content_5454164.htm
经国务院批准,现将2020年元旦、春节、清明节、劳动节、端午节、国庆节和中秋节放假调休日期的具体安排通知如下。
一、元旦:2020年1月1日放假,共1天。
二、春节:1月24日至30日放假调休,共7天。1月19日(星期日)、2月1日(星期六)上班。
三、清明节:4月4日至6日放假调休,共3天。
四、劳动节:5月1日至5日放假调休,共5天。4月26日(星期日)、5月9日(星期六)上班。
五、端午节:6月25日至27日放假调休,共3天。6月28日(星期日)上班。
六、国庆节、中秋节:10月1日至8日放假调休,共8天。9月27日(星期日)、10月10日(星期六)上班。
##实现方式:# 正常情况下,根据周六日即可获取正常工作日和周六日;# 由于法定节假日及调休补班的日子比较少,将两种手动保存下来,作为排除即可。# 2020年法定节假日holiday_2020=0101,0124,0125,0126,0127,0128,0129,0130,0125,0125,0125,0125,0125,0125,0404,0405,0406,0501,0502,0503,0504,0505,0625,0627,1001,1002,1003,1004,1005,1006,1007,1008# 2020年调休补班makeUp4Rest_2020=0119,0201,0426,0509,0628,0927,1010# 2021年法定节假日#holiday_2021=# 2021年调休补班#makeUp4Rest_2021=
我采用的是将这些日期存放在配置文件中holiday.properties中,key后缀为年份,代码中动态去加载。
为了做成静态工具类WorkingDay,这里通过静态代码块将properties文件中的配置信息解析成两个Set集合:
//节假日private static Set<String> holidaySet;//调休补班private static Set<String> makeUp4RestSet;static {try {ClassPathResource cpr = new ClassPathResource("holiday.properties");Properties properties = new Properties();properties.load(cpr.getInputStream());int year = new DateTime().getYear();String holidayStr = (String) properties.get("holiday_" + year);holidaySet = new HashSet<>(Arrays.asList(StringUtils.split(holidayStr, ',')));String makeUp4RestStr = (String) properties.get("makeUp4Rest_" + year);makeUp4RestSet = new HashSet<>(Arrays.asList(StringUtils.split(makeUp4RestStr, ',')));logger.info("加载节假日配置文件得到holidaySet={},makeUp4RestSet={}", holidaySet, makeUp4RestSet);} catch (IOException e) {logger.error("加载节假日配置文件holiday.properties出现异常:", e);}}
WorkingDay工具类的API://是否工作日public static boolean isWorkingDay(Date date){}//判断date的性质返回Enum或codepublic DateTypeEnum judgeDateTypeEnum(Date date) {}public Integer judgeDateTypeCode(Date date) {}//获取与date相隔一定工作日的日期(days<0向前,days>0向后)public static Date plusWorkingDay(Date date, Integer days){}
3. 总结
配置信息也可以存放在数据库中,当然也可以直接定义在代码中。当然更改数据库是最灵活的,不需要更新代码和重启服务器。
每年国务院发布一次节假日及调休信息后,只需要添加配置就可以了,后缀是需要配置的年份。
附件:
1. WorkingDay.java
import com.jd.common.util.StringUtils;import org.joda.time.DateTime;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.io.ClassPathResource;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.*;/*** 工作日实现类** @Author zhaohong* @Date 2020/4/14 18:18*/public class WorkingDay {private static Logger logger = LoggerFactory.getLogger(WorkingDay.class);//节假日private static Set<String> holidaySet;//调休补班private static Set<String> makeUp4RestSet;static {try {ClassPathResource cpr = new ClassPathResource("holiday.properties");Properties properties = new Properties();properties.load(cpr.getInputStream());int year = new DateTime().getYear();String holidayStr = (String) properties.get("holiday_" + year);holidaySet = new HashSet<>(Arrays.asList(StringUtils.split(holidayStr, ',')));String makeUp4RestStr = (String) properties.get("makeUp4Rest_" + year);makeUp4RestSet = new HashSet<>(Arrays.asList(StringUtils.split(makeUp4RestStr, ',')));logger.info("加载节假日配置文件得到holidaySet={},makeUp4RestSet={}", holidaySet, makeUp4RestSet);} catch (IOException e) {logger.error("加载节假日配置文件holiday.properties出现异常:", e);}}/*** 获取与date相隔days个工作日** @param date null默认为当前时间* @param days null返回date* @return*/public static Date plusWorkingDay(Date date, Integer days) {if (date == null) {date = new Date();}if (days == null || days.intValue() == 0) {//days == 0时返回datereturn date;}int daysAbs = Math.abs(days);//days> 0,1;days<0,-1int plusNum = days / daysAbs;DateTime dateTime = new DateTime(date);while (daysAbs > 0) {dateTime = dateTime.plusDays(plusNum);if (isWorkingDay(dateTime.toDate())) {daysAbs--;}}return dateTime.toDate();}/*** 是否是工作日(需要工作的日子):包括调休补班* # 某一天的性质分成四种:* # 0. 正常工作日为0,Weekday* # 1. 正常周六日为1,Weekend* # 2. 法定节假日为2,holiday* # 3. 周六日调休补班为3,makeUp4Rest** @param date* @return*/public static boolean isWorkingDay(Date date) {SimpleDateFormat sdf = new SimpleDateFormat("MMdd");String monDay = sdf.format(date);//是否是节假日if (holidaySet.contains(monDay)) {return false;}//非节假日Calendar calendar = Calendar.getInstance();calendar.setTime(date);//周日1---周六7int week = calendar.get(Calendar.DAY_OF_WEEK);//排除节假日之外的工作日必须工作;需要调休补班的周六日需要工作if ((week > 1 && week < 7) || makeUp4RestSet.contains(monDay)) {return true;}return false;}/*** 取date的性质返回code 0/1/2/3** @param date* @return*/public Integer judgeDateTypeCode(Date date) {DateTypeEnum dateTypeEnum = judgeDateTypeEnum(date);return dateTypeEnum != null ? dateTypeEnum.getCode() : null;}/*** 获取date的性质返回枚举类型** @param date* @return*/public DateTypeEnum judgeDateTypeEnum(Date date) {SimpleDateFormat sdf = new SimpleDateFormat("MMdd");String monDay = sdf.format(date);//是否是节假日if (holidaySet.contains(monDay)) {return DateTypeEnum.HOLIDAY;}//调休补班日if (makeUp4RestSet.contains(monDay)) {return DateTypeEnum.MAKE_UP_4_REST;}////非节假日Calendar calendar = Calendar.getInstance();calendar.setTime(date);//周日1---周六7int week = calendar.get(Calendar.DAY_OF_WEEK);if (week > 1 && week < 7) {return DateTypeEnum.NORMAL_WEEKDAY;}return DateTypeEnum.NORMAL_WEEKEND;}/*** 某一天的性质分成四种:* 0. 正常工作日为0,Weekday* 1. 正常周六日为1,Weekend* 2. 法定节假日为2,holiday* 3. 周六日调休补班为3,makeUp4Rest*/public enum DateTypeEnum {NORMAL_WEEKDAY(0, "正常工作日"),NORMAL_WEEKEND(1, "正常周六日"),HOLIDAY(2, "节假日"),MAKE_UP_4_REST(3, "调休补班日");//原是周六日才会需要补班DateTypeEnum(int code, String desc) {this.code = code;this.desc = desc;}private int code;private String desc;public int getCode() {return code;}public String getDesc() {return desc;}}}
2. holiday.properties文件
# 2020年法定节假日holiday_2020=0101,0124,0125,0126,0127,0128,0129,0130,0125,0125,0125,0125,0125,0125,0404,0405,0406,0501,0502,0503,0504,0505,0625,0627,1001,1002,1003,1004,1005,1006,1007,1008# 2020年调休补班makeUp4Rest_2020=0119,0201,0426,0509,0628,0927,1010# 2021年法定节假日#holiday_2021=# 2021年调休补班#makeUp4Rest_2021=
工作日节假日调休日休息日的判断API-holiday相关推荐
- python- 工作/休息/调休日怎么精准判断
python的第三方模块chinesecalendar,提供了判断工作日.休息日.节假日的方法. 不仅可以判断法定节假日,还可以返回节假日的名称,对调休日也可以做出判断,十分好用. 具体用法如下: 1 ...
- 最简单判断工作日/节假日API
由于开发的系统需要根据工作日和节假日来进行逻辑判断,所以这里研究了下方案: 1. 自己维护一份日历表,把每天的日期类型标注清楚 之前的一家公司就是这样解决的,需要每年去手动更新.如果公司规模比较大,对 ...
- 调用免费API查询全年工作日、周末、法定节假日、节假日调休补班数据
调用免费API查询全年工作日.周末.法定节假日.节假日调休补班数据 前言 日常开发中,难免会用到判断今天是工作日.周末.法定节假日.节假日调休补班做一些业务处理,例如:仅在上班时间给用户推送消息.本文 ...
- java 获取日期是否是工作日(包括正常工作日和节假日调休补班)
本博客提供两个方法,集成一个工具类 1.传入 yyyyMMdd 格式的 String 类型时间 返回今天是否是工作日,请求http://api.goseek.cn/ 网站 获取 getIsWorkin ...
- 根据工作日/节假日收货要求计算预计发货时间
1.需求: 根据下单时间orderTime(这里默认是系统时间); 客户收货时间要求:工作日=1,节假日2; 计算预计发货时间(这里需要运输时长); 2.思路: 要计算预计发货时间,(仓库的发货截止 ...
- java节假日 调休的代码,java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...
1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取). 2.工具类代码 /** * @author: ...
- iOS11新增版本判断API
iOS11新增版本判断API iOS11版本现在有了简单的API,OC也开始支持swfit的@available语法,不用再手写iOS版本判断了. if (@available(iOS 11.0, * ...
- 2018 工作日节假日字典表
2018 工作日节假日字典表 基于oracle数据库的2018年度工作日,节假日字典表: create table WorkingCalendar( rq date, week number(1), ...
- 利用tushare和pandas获得沪深300指数在每个工作日的平均日收益率
我用下面的代码来获得沪深300指数在不同工作日的平均日收益率. 运用的python包有: pandas tushare numpy datetime #导入需要的包 import pandas as ...
- 获取下一个工作日/休息日的方法 本地基础搭建 Springboot 法定节假日/休息日/调休日 均可 不用调三方
场景 我们在一些特殊的业务场景下,想要获取到下一个工作日,这里的工作日指正常的法定工作日(包含调休日),这个需求来源于银联的提现,银联只能在法定工作日才能体现,那么在业务代码里对提现日期必须就是工作日 ...
最新文章
- 无线红外探测器01-产品简介和功能需求
- 如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
- 上海计算机职业学校排名2015年,2015年上海各区学校教育资源实力排行榜
- 微信小程序-智能机器人
- chromebook刷机_如何在Chromebook上切换(或离开)Canary频道
- Tips--Altium Designer 安装时出现Account log in
- shiro利用mysql动态授权_SpringBoot+Shiro学习之数据库动态权限管理和Redis缓存
- 酒泉于洋计算机学校,于洋
- pg_rewind 快速角色切换
- 3700打印机和计算机连接,WNDR3700成功实现打印机服务器功能(刷机成WNDR3800)
- ASP经典分页类(改良后的分页类主要是显示属性)
- java8—Stream
- 麦克斯韦电磁场理论基础
- scv文件单元格内存在换行符
- 怎样用matlab画斜条纹图案,CorelDRAW制作简单的均匀倾斜条纹
- jszip打包下载文件
- imageJ的二次开发(全)
- css制作向下的三角形
- 一台电脑上配置多个git账号(gitee),向不同git线上仓库提交(命令行/TortoiseGit同时) 代码
- Failed to introspect Class [org.springframework.cloud.context.properties.ConfigurationPropertiesBean