除过法定节假日,计算截至日期的算法
1.获取当年节假日信息
请求链接:https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php? query=2020&resource_id=6018
组装所有节假日及调休
private static JSONArray getHoliday() {
String s = HttpUtil.get("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php? query=2020&resource_id=6018");
JSONObject jsonObject = JSONObject.parseObject(s);
JSONArray data = (JSONArray) jsonObject.get("data");
JSONObject item = (JSONObject) data.get(0);
JSONArray holidays = item.getJSONArray("holiday");
JSONArray jsonArray = new JSONArray();
holidays.stream().forEach(it -> {
JSONObject holiday = (JSONObject) it;
JSONArray list = holiday.getJSONArray("list");
for (Object o : list) {
JSONObject i = (JSONObject) o;
if (null == i.getJSONArray("list")) {
jsonArray.add(i);
} else {
jsonArray.addAll(i.getJSONArray("list"));
}
}
});
//组装格式为为 "list":[ { "date":"2020-1-1","status":"1" } ] status 1: 代表假期 2:调休工作日
return jsonArray;
}
给定日期数组,以及获取的假期数据,计算去除法定节假日以及周末后的截至日期
对所有日期数组进行遍历,逐个进行判断处理
private static DateTime getLimitTime(List<DateTime> dateTimes, JSONArray jsonArray) {
List<String> date = jsonArray.stream().map(it -> ((JSONObject) it).getString("date")).collect(Collectors.toList());
Map<String, String> map = jsonArray.stream().collect(Collectors.toMap(it -> ((JSONObject) it).getString("date"), it -> ((JSONObject) it).getString("status"), (pre, next) -> pre));
DateTime offsetDate = null;
for (int i = 0; i < dateTimes.size(); i++) {
String formatDate = DateUtil.format(dateTimes.get(i), "yyyy-M-d");
if (i == 0) {
continue;
}
if (date.contains(formatDate)) {
String status = map.get(formatDate);
if ("1".equals(status)) {
offsetDate = DateUtil.offsetDay(dateTimes.get(i), dateTimes.size() - i);
dateTimes.add(offsetDate);
}
} else {
int week = DateUtil.dayOfWeek(dateTimes.get(i));
if ((week == 1 || week == 7)) {
offsetDate = DateUtil.offsetDay(dateTimes.get(i), dateTimes.size() - i);
dateTimes.add(offsetDate);
}else {
offsetDate = dateTimes.get(i);
}
}
}
return offsetDate;
}
主方法 ,执行
先获取当前日期和截至天数有日期数组,然后就获取到当前日期距离天数后除过法定节假日后得到的截至日期
public static void main(String[] args) {
JSONArray jsonArray = getHoliday();
DateTime date = DateUtil.parseDate("2020-09-25");
DateTime dateTime = DateUtil.offsetDay(date, 5);
List<DateTime> dateTimes = DateUtil.rangeToList(date, dateTime, DateField.DAY_OF_YEAR);
DateTime limitTime = getLimitTime(dateTimes, jsonArray);
System.out.println(limitTime);
}
如果你有好的思路算法,请在下方评论处进行讨论