日期顺时,自动跳过节假日

在开发的时候客户提了一个需求,要求处理人/日期这一栏的日期是当天日期的后俩天日期并且自动跳过节假日,
这个我知道的有三种做法,其实是一种,细分成三小类
1:创建excel表格,记录该年节假日日期,然后获取目标日期进行比较,这个方法的缺点极其明显,需要比较,需要记录每年的日期,明显效率低;
2:创建数据,将目标日期通过SQL查询,类似第一种,但是比第一种优异一些,但仍是需要耗费资源和时间;
3:利用第三方接口,通过接口api来判断这一天是不是节假日,比较推荐这种方式;
在寻找第三方接口的时候找到以下几个接口,但是我能用的就只有红色标注的接口(第五个),其他的返回结果都是错误的:

// String httpUrl = "https://www.juhe.cn/docs/api/id/177";
//String httpUrl = "http://api.goseek.cn/Tools/holiday";
// String httpUrl = "http://www.easybots.cn/api/holiday.php";
// String httpUrl = "http://www.easybots.cn/holiday_api.net";
//String httpUrl = "http://tool.bitefu.net/jiari/"; //可以试试

下面开始上代码
第三方接口判断节假日格式
httpUrl = "http://tool.bitefu.net/jiari/?d=年月日; 工作日返回0,双休日返回1,节日返回2

/*
  判断是否是节假日,返回String类型,参数,第三接口api(String类型),日期(String类型(格式年月日))
*/
public static String getHolidays(String httpUrl, String httpArg) {
BufferedReader reader = null;
String result = null;
StringBuffer sbf = new StringBuffer();
httpUrl = httpUrl + "?d=" + httpArg;
try {
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setRequestMethod("GET");
connection.connect();
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead);
sbf.append(" ");
}
reader.close();
result = sbf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

public static void main(String[] args) throws UnsupportedEncodingException {
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
c.add(Calendar.DATE, 2);
String twoDaysLater = df.format(c.getTime());//获取俩天后格式为年月日的日期
String httpUrl = "http://tool.bitefu.net/jiari/"; //可以试试
String result = getHolidays(httpUrl, twoDaysLater);
System.out.println("result=" + result + "result的长度=" + result.length());
System.out.println("0".length());
  /*
    此处特别解释,为什么会有对字符长度的输出,因为,虽然getHolidays方法获取的结果是0,1,2
    但是却不能直接equals比较,因为getHolidays返回的结果字符长度是3,因为该方法输出的结果
    后面是有看不见的空格的,我因直接比较犯了错,所以在此处打印比较测试我当初的猜想,结果如我所料

  */
System.out.println("result.equals("0")=" + result.equals("0"));
String lastDay = "";
while (!result.trim().equals("0")) {//警告,这种已知的字符串比较一定要加.trim()去空格
c.add(Calendar.DATE, 1);//如果目标日期是节假日则顺时开始下一天的判断
lastDay = df.format(c.getTime());
System.out.println("lastDay=" + lastDay);
result = getHolidays(httpUrl, lastDay);
System.out.println("while循环内result=" + result);
System.out.println("if循环外result.equals("0")=" + result.equals("0"));
if (result.trim().equals("0")) { //获取的日期不是节假日开始跳出循环         
 System.out.println("result.equals("0")=" + result.equals("0"));  
 break; }
}
System.out.println(lastDay);
System.out.println(getDateFormat(lastDay));}

附:文中的syso是我用来测试输出结果的,其实处理下来也不算难,弄清楚关键的俩个点就可以了,使用正确的api接口
正确获取连续的日期进行比较并且返回结果!

原文地址:https://www.cnblogs.com/lg-wxf/p/9668839.html