springboot框架调取百度api获取节假日期,并获取某年某月的工作日天数(除去国家法定节假日)
统计考勤的业务需求,写了一个接口,将一年的节假日保存入库,以便获取某月的工作日天数的时候,可以去掉节假日,加上是工作日的周六周天日。精准的获取某月的应到天数。该接口是将假期保存入库。状态为1的是放假日,状态为2的是工作日。
@RestController public class HolidayController { @Autowired private IHolidayService iHolidayService; static String BAIDU_URL = "http://opendata.baidu.com/api.php?resource_id=6018&format=json&query="; @PostMapping("/saveHoliday") @ResponseBody public ResultData saveHoliday(@RequestParam(value = "month",required = false) String month) throws ParseException { // System.out.println("holidayExist==="+ WorkDayUtils.getWorkDay()); int a = 0; SimpleDateFormat format = new SimpleDateFormat("yyyy-M-d"); SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); List<String> list = new ArrayList<String>(); //String month = "2020-10"; Map<String,Object> map = new HashMap<String,Object>(); String responseStr = ""; try{ responseStr = HttpUtil.post(BAIDU_URL+month,map); }catch (Exception e){ e.printStackTrace(); // throw new Exception("第三方接口异常"); } // JSONObject objects = JSONObject.fromObject(responseStr); com.alibaba.fastjson.JSONObject jsonTokenStr = JSON.parseObject(responseStr); // System.out.println("responseStr"+JSON.toJSONString(jsonTokenStr)); if(jsonTokenStr.getString("status").equalsIgnoreCase("0")){ JSONArray data = jsonTokenStr.getJSONArray("data"); System.out.println("data"+data); if(data.size()>0){ JSONObject item = data.getJSONObject(0); JSONArray holiday = item.getJSONArray("holiday"); System.out.println("holiday"+holiday); if(holiday.size()>0){ for(int i = 0 ; i < holiday.size(); i ++){ JSONObject h = holiday.getJSONObject(i); JSONArray hh = h.getJSONArray("list"); if(hh.size()>0){ for(int j = 0; j < hh.size(); j++){ JSONObject hhh = hh.getJSONObject(j); String dateStr = hhh.getString("date"); dateStr = format1.format(format.parse(dateStr)); // if(hhh.getString("status").equals("1")){ // list.add(dateStr); // } Holiday holidays = new Holiday(); holidays.setDate(dateStr); List<Holiday> holidayExist = iHolidayService.selectHolidayList(holidays); System.out.println("holidayExist==="+holidayExist); if(holidayExist.size()==0){//已经有数据 Holiday holiday1 = new Holiday(); holiday1.setDate(dateStr); holiday1.setWorkstate(hhh.getString("status")); holiday1.setValid("Y"); a= iHolidayService.insertHoliday(holiday1); } } } } } } } return ResultData.toresult(a); } }
百度接口地址http://opendata.baidu.com/api.php?resource_id=6018&format=json&query=2020-12 返回的数据格式为:
: { "status": "0", "t": "", "set_cache_time": "", "data": [ { "StdStg": 6018, "StdStl": 8, "_update_time": "1580102250", "cambrian_appid": "0", "almanac": [ { "avoid": "栽种.破土.置产.祭祀.嫁娶.动土.作灶.祈福.", "date": "2020-12-1", "suit": "开市.交易.立券.挂匾.纳财.开光.出行.入宅.移徙.安床.纳畜.入殓.移柩.安葬." }, { "avoid": "", "date": "2020-12-2", "suit": "嫁娶.祭祀.祈福.求嗣.开光.出行.解除.出火.出行.拆卸.进人口.入宅.移徙.安床.栽种.动土.修造.纳畜.入殓.安葬.立碑.除服.成服." }, { "avoid": "嫁娶.开市.出火.栽种.破土.动土.入宅.移徙.安香.分居.掘井.作灶.", "date": "2020-12-3", "suit": "开光.解除.拆卸.修造.动土.安床.纳畜.安葬.启攒.入殓." }, { "avoid": "诸事不宜.", "date": "2020-12-4", "suit": "破屋.坏垣.余事勿取." }, { "avoid": "探病.安葬.", "date": "2020-12-5", "suit": "嫁娶.祭祀.开光.出火.出行.拆卸.修造.动土.解除.开市.交易.立券.挂匾.纳财.入宅.移徙.安床.栽种.纳畜." }, { "avoid": "入宅.作灶.词讼.移徙.出行.赴任.", "date": "2020-12-6", "suit": "祭祀.祈福.求嗣.开光.解除.理发.会亲友.栽种.纳畜.牧养.安葬.修坟.立碑.启攒." }, { "avoid": "嫁娶.动土.安床.造桥.掘井.", "date": "2020-12-7", "suit": "纳采.订盟.移徙.入宅.出行.安机械.会亲友.祭祀.祈福.斋醮.开光.安香.出火.解除.求医.针灸.治病.造屋.起基.修造.安门.造船.纳畜.牧养.移柩.入殓.启攒.谢土.修坟.立碑." }, { "avoid": "开市.斋醮.破土.安葬.", "date": "2020-12-8", "suit": "祭祀.沐浴.作灶.纳财.捕捉.畋猎.安床.扫舍." }, { "avoid": "移徙.开市.入宅.安葬.", "date": "2020-12-9", "suit": "祈福.斋醮.纳采.订盟.解除.架马.开柱眼.修造.动土.起基.上梁.归岫.造屋.合脊.掘井.除服.成服.破土.栽种." }, { "avoid": "嫁娶.祈福.开光.掘井.安葬.行丧.", "date": "2020-12-10", "suit": "纳采.订盟.祭祀.沐浴.冠笄.合帐.裁衣.修造.动土.拆卸.移徙.入宅.安门.开仓.筑堤.作厕.栽种.纳畜.补垣.塞穴." }, { "avoid": "入宅.动土.破土.嫁娶.作灶.造船.", "date": "2020-12-11", "suit": "合帐.裁衣.教牛马.余事勿取." }, { "avoid": "斋醮.作梁.掘井.行丧.安葬.", "date": "2020-12-12", "suit": "纳采.订盟.嫁娶.祭祀.祈福.安香.出火.出行.会亲友.经络.求医.治病.解除.拆卸.起基.修造.动土.定磉.扫舍.栽种.牧养.造畜椆栖." }, { "avoid": "嫁娶.祈福.出火.移徙.入宅.", "date": "2020-12-13", "suit": "纳财.开市.交易.立券.会亲友.进人口.经络.祭祀.祈福.安香.出火.求医.治病.修造.动土.拆卸.扫舍.安床.栽种.牧养.开生坟.合寿木.入殓.安葬.启攒." }, { "avoid": "入宅.修造.动土.破土.安门.上梁.", "date": "2020-12-14", "suit": "祭祀.入殓.移柩.余事勿取." }, { "avoid": "掘井.伐木.斋醮.作灶.", "date": "2020-12-15", "suit": "塑绘.开光.订盟.纳采.裁衣.冠笄.拆卸.修造.安床.入宅.出火.安葬.谢土.赴任." }, { "avoid": "出行.安葬.修坟.开市.", "date": "2020-12-16", "suit": "祭祀.塑绘.开光.裁衣.冠笄.嫁娶.纳采.拆卸.修造.动土.竖柱.上梁.安床.移徙.入宅.安香.结网.捕捉.畋猎.伐木.进人口.放水." }, { "avoid": "诸事不宜.", "date": "2020-12-17", "suit": "祭祀.求医.破屋.坏垣.余事勿取." }, { "avoid": "开光.栽种.治病.安门.作灶.", "date": "2020-12-18", "suit": "祭祀.祈福.斋醮.出行.冠笄.安机械.移徙.入宅.安香.安床.除服.成服.移柩.启攒." }, { "avoid": "", "date": "2020-12-19", "suit": "塑绘.斋醮.出行.拆卸.解除.修造.移徙.造船.入殓.除服.成服.移柩.启攒.修坟.立碑.谢土." }, { "avoid": "开市.破土.", "date": "2020-12-20", "suit": "祭祀.沐浴.安床.纳财.畋猎.捕捉." }, { "avoid": "嫁娶.作灶.", "date": "2020-12-21", "suit": "订盟.纳采.祭祀.祈福.修造.动土.上梁.破土." }, { "avoid": "入宅.安葬.", "date": "2020-12-22", "suit": "出行.沐浴.理发.补垣.塞穴." }, { "avoid": "入宅.动土.破土.余事勿取.", "date": "2020-12-23", "suit": "教牛马.余事勿取." }, { "avoid": "开市.安葬.", "date": "2020-12-24", "suit": "嫁娶.出行.求医.治病.祭祀.祈福.上梁.纳畜." }, { "avoid": "嫁娶.祈福.", "date": "2020-12-25", "suit": "开市.立券.开光.解除.安机械.上梁.启攒.安葬." }, { "avoid": "诸事不宜.", "date": "2020-12-26", "suit": "平治道涂.余事勿取." }, { "avoid": "开市.嫁娶.", "date": "2020-12-27", "suit": "求嗣.斋醮.塑绘.订盟.纳采.出火.拆卸.修造.动土.造桥.安机械.栽种.纳畜.牧养.入殓.除服.成服.移柩.破土.安葬." }, { "avoid": "开市.安葬.", "date": "2020-12-28", "suit": "嫁娶.订盟.纳采.祭祀.祈福.修造.动土.移徙.入宅." }, { "avoid": "诸事不宜.", "date": "2020-12-29", "suit": "治病.破屋.坏垣.余事勿取." }, { "avoid": "造桥.安门.理发.造庙.栽种.作灶.", "date": "2020-12-30", "suit": "祭祀.祈福.求嗣.斋醮.开光.入学.订盟.冠笄.伐木.修造.动土.起基.放水.交易.开池." }, { "avoid": "诸事不宜.", "date": "2020-12-31", "suit": "解除.坏垣.余事勿取." } ], "holiday": [ { "desc": "1月1日放假一天", "festival": "2020-1-1", "list": [ { "date": "2020-1-1", "status": "1" } ], "list#num#baidu": 1, "name": "元旦", "rest": "2019年12月30日和2019年12月31日请假两天,与周末连休可拼5天小长假。" }, { "desc": "1月24日放假一天", "festival": "2020-1-24", "list": [ { "date": "2020-1-24", "status": "1" } ], "list#num#baidu": 1, "name": "除夕", "rest": "农历腊月最后一天为除夕,即大年初一前夜,又称为年三十。" }, { "desc": "1月24日(除夕)至1月30日放假7天,1月19日,2月1日上班", "festival": "2020-1-25", "list": [ { "date": "2020-1-24", "status": "1" }, { "date": "2020-1-25", "status": "1" }, { "date": "2020-1-26", "status": "1" }, { "date": "2020-1-27", "status": "1" }, { "date": "2020-1-28", "status": "1" }, { "date": "2020-1-29", "status": "1" }, { "date": "2020-1-30", "status": "1" }, { "date": "2020-1-19", "status": "2" }, { "date": "2020-1-31", "status": "1" }, { "date": "2020-2-1", "status": "1" }, { "date": "2020-2-2", "status": "1" } ], "list#num#baidu": 11, "name": "春节", "rest": "2020年1月19日至2020年1月23日请假5天,与周末连休可拼13天长假。" }, { "desc": "4月4日至4月6日放假3天", "festival": "2020-4-4", "list": [ { "date": "2020-4-4", "status": "1" }, { "date": "2020-4-5", "status": "1" }, { "date": "2020-4-6", "status": "1" } ], "list#num#baidu": 3, "name": "清明节", "rest": "2020年4月7日至2020年4月10日请假4天,与周末连休可拼9天长假。" }, { "desc": "5月1日至5月5日放假5天,4月26日,5月9日上班", "festival": "2020-5-1", "list": [ { "date": "2020-5-1", "status": "1" }, { "date": "2020-5-2", "status": "1" }, { "date": "2020-5-3", "status": "1" }, { "date": "2020-5-4", "status": "1" }, { "date": "2020-5-5", "status": "1" }, { "date": "2020-4-26", "status": "2" }, { "date": "2020-5-9", "status": "2" } ], "list#num#baidu": 7, "name": "劳动节", "rest": "2020年4月26日至2020年4月30日请假5天,与周末连休可拼11天长假。" }, { "desc": "6月25日至6月27日放假3天,6月28日上班", "festival": "2020-6-25", "list": [ { "date": "2020-6-25", "status": "1" }, { "date": "2020-6-26", "status": "1" }, { "date": "2020-6-27", "status": "1" }, { "date": "2020-6-28", "status": "2" } ], "list#num#baidu": 4, "name": "端午节", "rest": "2020年6月22日至2020年6月24日请假3天,与周末连休可拼8天长假。" }, { "desc": "10月1日至10月8日放假8天,9月27日,10月10日上班", "festival": "2020-10-1", "list": [ { "date": "2020-10-1", "status": "1" }, { "date": "2020-10-2", "status": "1" }, { "date": "2020-10-3", "status": "1" }, { "date": "2020-10-4", "status": "1" }, { "date": "2020-10-5", "status": "1" }, { "date": "2020-10-6", "status": "1" }, { "date": "2020-10-7", "status": "1" }, { "date": "2020-10-8", "status": "1" }, { "date": "2020-9-27", "status": "2" }, { "date": "2020-10-10", "status": "2" } ], "list#num#baidu": 10, "name": "中秋节", "rest": "10月9日至10月10日请假2天,与周末连休可拼11天长假。" }, { "desc": "10月1日至10月8日放假8天,9月27日,10月10日上班", "festival": "2020-10-1", "list": [ { "date": "2020-10-1", "status": "1" }, { "date": "2020-10-2", "status": "1" }, { "date": "2020-10-3", "status": "1" }, { "date": "2020-10-4", "status": "1" }, { "date": "2020-10-5", "status": "1" }, { "date": "2020-10-6", "status": "1" }, { "date": "2020-10-7", "status": "1" }, { "date": "2020-10-8", "status": "1" }, { "date": "2020-9-27", "status": "2" }, { "date": "2020-10-10", "status": "2" } ], "list#num#baidu": 10, "name": "国庆节", "rest": "10月9日至10月10日请假2天,与周末连休可拼11天长假。" } ], "holidaylist": [ { "name": "元旦", "startday": "2020-1-1" }, { "name": "除夕", "startday": "2020-1-24" }, { "name": "春节", "startday": "2020-1-25" }, { "name": "清明节", "startday": "2020-4-4" }, { "name": "劳动节", "startday": "2020-5-1" }, { "name": "端午节", "startday": "2020-6-25" }, { "name": "中秋节", "startday": "2020-10-1" }, { "name": "国庆节", "startday": "2020-10-1" } ], "key": "2020年12月", "selectday": "2020-12-1", "url": "http://nourl.baidu.com/6018", "loc": "http://open.baidu.com/q?r=2002753&k=2020%E5%B9%B412%E6%9C%88", "SiteId": 2002753, "_version": 2767, "_select_time": 1580102077, "clicklimit": "1-3", "ExtendedLocation": "", "OriginQuery": "2020-12", "tplt": "calendar_new", "resourceid": "6018", "fetchkey": "6018_2020年12月", "role_id": 10, "disp_type": 0, "appinfo": "" } ] }
然后通过公共方法获取某月工作日的天数 // 返回工作日集合,只排除周末 public static List<Date> getWorkDays(int year, int month){ // 用于储存每月工作日 List<Date> dates = new ArrayList<Date>(); Calendar cal = Calendar.getInstance(); //设置月份 cal.set(Calendar.YEAR, year); // 设置月份 cal.set(Calendar.MONTH, month - 1); // 设置为当月第一天 cal.set(Calendar.DATE, 1); while(cal.get(Calendar.YEAR) == year && cal.get(Calendar.MONTH) < month){ // 判断当前天为本周的第几天 int day = cal.get(Calendar.DAY_OF_WEEK); // 如果不为周六或者周天,将日期进行储存 if(!(day == Calendar.SUNDAY || day == Calendar.SATURDAY)){ dates.add((Date)cal.getTime().clone()); } // 将当前日期增加一天 cal.add(Calendar.DATE, 1); } // 返回当前月工作日集合 return dates; } /** * * @param dateList * @return 返回日期字符串集合 */ public static List<String> getDateString(List<Date> dateList){ // 储存日期字符串 List<String> dateString = new ArrayList<>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); for (Date date : dateList){ String date2 = simpleDateFormat.format(date); dateString.add(date2); } return dateString; } public static int getWorkDay(String month){ List<Date> workDays = getWorkDays(Integer.parseInt(month.split("-")[0]), Integer.parseInt(month.split("-")[1])); // 获取工作日字符串集合 List<String> dateString = getDateString(workDays); // 获取法定节假日集合 List list = staticMapper.selectHolidayByDate(month); System.out.println("list==="+list.size()); List holidayList= new ArrayList(); List workdayList= new ArrayList(); for(int i =0;i<list.size();i++){ Holiday holiday11 = (Holiday) list.get(i); if(holiday11.getWorkstate().equals("1")){ holidayList.add(holiday11.getDate()); }else if(holiday11.getWorkstate().equals("2")){ workdayList.add(holiday11.getDate()); } } // List<String> holidays = HolidayUtils.getList(month); // System.out.println("holidays==="+holidays); // 从工作日中除去法定节假日 dateString.removeAll(holidayList); // 从工作日中增加周六日工作日 dateString.addAll(workdayList); System.out.println(dateString.size()); // 遍历纯工作日集合 for (String date : dateString){ System.out.println(date); } return dateString.size(); }
本文原创,转载必追究版权。