在開發的時候客戶提了一個需求,要求處理人/日期這一欄的日期是當天日期的后倆天日期並且自動跳過節假日,
這個我知道的有三種做法,其實是一種,細分成三小類
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("\r\n");
}
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接口
正確獲取連續的日期進行比較並且返回結果!