package cn.timer.api.controller.kqgl.holiday; import java.io.IOException; import java.net.MalformedURLException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.DomNodeList; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlPage; import cn.timer.api.bean.kqmk.KqmkRedletterDay; import cn.timer.api.dao.kqmk.KqmkRedletterDayMapper; public class Main { private static String latestVocationName = ""; public String getVocationName(DomNodeList<HtmlElement> htmlElements, String date) throws ParseException { String rst = ""; boolean pastTimeFlag = false; DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); Date paramDate = dateFormat.parse(date); if (new Date().getTime() >= paramDate.getTime()) { pastTimeFlag = true; } //first step //jugde if can get vocation name from html page for (int i = 0; i < htmlElements.size(); i++) { HtmlElement element = htmlElements.get(i); if (element.getAttribute("class").indexOf("vacation") != -1) { boolean hitFlag = false; String voationName = ""; for (; i < htmlElements.size(); i++) { HtmlElement elementTmp = htmlElements.get(i); String liDate = elementTmp.getAttribute("date"); List<HtmlElement> lunar = elementTmp.getElementsByAttribute("span", "class", "lunar"); String lanarText = lunar.get(0).asText(); if (lanarText.equals("元旦")) { voationName = "元旦"; } else if (lanarText.equals("除夕") || lanarText.equals("春节")) { voationName = "春节"; } else if (lanarText.equals("清明")) { voationName = "清明"; } else if (lanarText.equals("国际劳动节")) { voationName = "国际劳动节"; } else if (lanarText.equals("端午节")) { voationName = "端午节"; } else if (lanarText.equals("中秋节")) { voationName = "中秋节"; } else if (lanarText.equals("国庆节")) { voationName = "国庆节"; } if (liDate.equals(date)) { hitFlag = true; } if (elementTmp.getAttribute("class").indexOf("vacation") == -1) { break; } } if (hitFlag == true && !voationName.equals("")) { rst = voationName; break; } } else { continue; } } //if first step fail(rarely), get from the latest Vocation name if (rst.equals("")) { System.out.println("warning: fail to get vocation name from html page."); //you can judge by some simple rule //from the latest Vocation name rst = Main.latestVocationName; } else if (pastTimeFlag == true) { //更新《当前时间,且最近一次的可见的假期名 Main.latestVocationName = rst; } return rst; } public List<ChinaDate> getCurrentDateInfo() { WebClient webClient = null; List<ChinaDate> dateList = null; try { DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); dateList = new ArrayList<ChinaDate>(); webClient = new WebClient(); HtmlPage page = webClient.getPage("http://hao.360.cn/rili/"); //最大等待60秒 for (int k = 0; k < 60; k++) { if (!page.getElementById("M-dates").asText().equals("")) break; Thread.sleep(1000); } //睡了8秒,等待页面加载完成...,有时候,页面可能获取不到,不稳定() //Thread.sleep(8000); DomNodeList<HtmlElement> htmlElements = page.getElementById("M-dates").getElementsByTagName("li"); //System.out.println(htmlElements.size()); for (HtmlElement element : htmlElements) { ChinaDate chinaDate = new ChinaDate(); List<HtmlElement> lunar = element.getElementsByAttribute("span", "class", "lunar"); List<HtmlElement> solar = element.getElementsByAttribute("div", "class", "solar"); chinaDate.setLunar(lunar.get(0).asText()); chinaDate.setSolar(solar.get(0).asText()); chinaDate.setSolarDate(dateFormat.parse(element.getAttribute("date"))); if (element.getAttribute("class").indexOf("vacation") != -1) { chinaDate.setVacation(true); chinaDate.setVacationName(this.getVocationName(htmlElements, element.getAttribute("date"))); } if (element.getAttribute("class").indexOf("weekend") != -1 && element.getAttribute("class").indexOf("last") == -1) { chinaDate.setSaturday(true); } if (element.getAttribute("class").indexOf("last weekend") != -1) { chinaDate.setSunday(true); } if (element.getAttribute("class").indexOf("work") != -1) { chinaDate.setWorkFlag(true); } else if (chinaDate.isSaturday() == false && chinaDate.isSunday() == false && chinaDate.isVacation() == false) { chinaDate.setWorkFlag(true); } else { chinaDate.setWorkFlag(false); } dateList.add(chinaDate); } } catch (Exception e) { e.printStackTrace(); System.out.println("get date from http://hao.360.cn/rili/ error~"); } finally { webClient.close(); } return dateList; } public ChinaDate getTodayInfo() { List<ChinaDate> dateList = this.getCurrentDateInfo(); DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); for (ChinaDate date : dateList) { if (dateFormat.format(date.getSolarDate()).equals(dateFormat.format(new Date()))) { return date; } } return new ChinaDate(); } public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException { List<ChinaDate> dateList = new Main().getCurrentDateInfo(); ChinaDate today = new Main().getTodayInfo(); DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); System.out.println("本月详情:"); String yymm = new SimpleDateFormat("yyyy-MM").format(new Date()).toString();// for (ChinaDate date : dateList) { // System.out.println(dateFormat.format(date.getSolarDate()) + " " + date.getVacationName()); // System.out.println(dateFormat.format(date.getSolarDate()).replaceAll("/", "-") + " " + date.getVacationName()); String str = dateFormat.format(date.getSolarDate()).replaceAll("/", "-"); //INSERT INTO kqmk_redletter_day VALUES ( value1, value2,...valueN ); String jieri = date.getVacationName(); boolean status = jieri.contains("节"); int holidaystatus = 0; if(status) { holidaystatus = 1; } System.out.println("INSERT INTO kqmk_redletter_day(holiday,holiday_name,holiday_status,belong_yearmonth) VALUES(" + '"'+str +'"'+ "," +'"'+date.getVacationName()+'"'+ "," +holidaystatus+ "," + '"'+yymm+'"'+ ");"); } // System.out.println("------------------------------------------------------------------------"); // System.out.println("今日详情:"); // System.out.println("日期:" + today.getSolarDate()); // System.out.println("农历:" + today.getLunar()); // System.out.println("公历:" + today.getSolar()); // System.out.println("假期名:" + today.getVacationName()); // System.out.println("是否周六:" + today.isSaturday()); // System.out.println("是否周日:" + today.isSunday()); // System.out.println("是否休假:" + today.isVacation()); // System.out.println("是否工作日:" + today.isWorkFlag()); // System.out.println("已发生的最近一次假期:" + Main.latestVocationName); } }