工作日节假日调休日休息日的判断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相关推荐

  1. python- 工作/休息/调休日怎么精准判断

    python的第三方模块chinesecalendar,提供了判断工作日.休息日.节假日的方法. 不仅可以判断法定节假日,还可以返回节假日的名称,对调休日也可以做出判断,十分好用. 具体用法如下: 1 ...

  2. 最简单判断工作日/节假日API

    由于开发的系统需要根据工作日和节假日来进行逻辑判断,所以这里研究了下方案: 1. 自己维护一份日历表,把每天的日期类型标注清楚 之前的一家公司就是这样解决的,需要每年去手动更新.如果公司规模比较大,对 ...

  3. 调用免费API查询全年工作日、周末、法定节假日、节假日调休补班数据

    调用免费API查询全年工作日.周末.法定节假日.节假日调休补班数据 前言 日常开发中,难免会用到判断今天是工作日.周末.法定节假日.节假日调休补班做一些业务处理,例如:仅在上班时间给用户推送消息.本文 ...

  4. java 获取日期是否是工作日(包括正常工作日和节假日调休补班)

    本博客提供两个方法,集成一个工具类 1.传入 yyyyMMdd 格式的 String 类型时间 返回今天是否是工作日,请求http://api.goseek.cn/ 网站 获取 getIsWorkin ...

  5. 根据工作日/节假日收货要求计算预计发货时间

    1.需求: 根据下单时间orderTime(这里默认是系统时间); 客户收货时间要求:工作日=1,节假日2; 计算预计发货时间(这里需要运输时长); 2.思路:  要计算预计发货时间,(仓库的发货截止 ...

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

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

  7. iOS11新增版本判断API

    iOS11新增版本判断API iOS11版本现在有了简单的API,OC也开始支持swfit的@available语法,不用再手写iOS版本判断了. if (@available(iOS 11.0, * ...

  8. 2018 工作日节假日字典表

    2018 工作日节假日字典表 基于oracle数据库的2018年度工作日,节假日字典表: create table WorkingCalendar( rq date, week number(1), ...

  9. 利用tushare和pandas获得沪深300指数在每个工作日的平均日收益率

    我用下面的代码来获得沪深300指数在不同工作日的平均日收益率. 运用的python包有: pandas tushare numpy datetime #导入需要的包 import pandas as ...

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

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

最新文章

  1. 无线红外探测器01-产品简介和功能需求
  2. 如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
  3. 上海计算机职业学校排名2015年,2015年上海各区学校教育资源实力排行榜
  4. 微信小程序-智能机器人
  5. chromebook刷机_如何在Chromebook上切换(或离开)Canary频道
  6. Tips--Altium Designer 安装时出现Account log in
  7. shiro利用mysql动态授权_SpringBoot+Shiro学习之数据库动态权限管理和Redis缓存
  8. 酒泉于洋计算机学校,于洋
  9. pg_rewind 快速角色切换
  10. 3700打印机和计算机连接,WNDR3700成功实现打印机服务器功能(刷机成WNDR3800)
  11. ASP经典分页类(改良后的分页类主要是显示属性)
  12. java8—Stream
  13. 麦克斯韦电磁场理论基础
  14. scv文件单元格内存在换行符
  15. 怎样用matlab画斜条纹图案,CorelDRAW制作简单的均匀倾斜条纹
  16. jszip打包下载文件
  17. imageJ的二次开发(全)
  18. css制作向下的三角形
  19. 一台电脑上配置多个git账号(gitee),向不同git线上仓库提交(命令行/TortoiseGit同时) 代码
  20. Failed to introspect Class [org.springframework.cloud.context.properties.ConfigurationPropertiesBean

热门文章

  1. realtek高清晰音频管理器没有设备高级设置怎么设置音箱与耳机同时响
  2. 基于vue的仿网易云音乐播放器
  3. 在电脑上怎么做报表新手_初学者在电脑上如何制作电子表格
  4. 安装vs2015 、如何创建MFC项目
  5. 计算机修改WINDOWS版本,Windows OEM修改器
  6. 摩尔定律和梅特卡夫定律_摩尔定律f
  7. Paraview使用指南
  8. 基于AP6212实现 Airkiss NDK编程
  9. pygame之mouse模块
  10. 软件工程——清华大学《软件工程》课程学习与分享