1. 程式人生 > >日期順時,自動跳過節假日

日期順時,自動跳過節假日

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