java计算工作日(包含法定节假日和调休)
SpringBoot项目中灵活使用Calendar类计算两个日期间的工作日数
·
需要解决的两个问题:
- 怎么判断一个日期是否是工作日
- 怎么有法定节假日和调休的数据
思路:
- 通过 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集合中,只要服务不停,整个生命周期内都有效,这样就免去了手动维护的工作
更多推荐
已为社区贡献1条内容
所有评论(0)