1. Prefacio
He encontrado un problema en el trabajo recientemente. Hay una tarea cronometrada en el backend. Necesito usar Java para juzgar las vacaciones legales, las vacaciones de fin de semana, el trabajo, etc. todos los días. De hecho, es básicamente imposible juzgar las vacaciones legales de China solo a través de la lógica, porque las vacaciones en el país pueden ser diferentes cada año y se establecen artificialmente;
Por lo tanto, solo puede confiar en otros medios, y los más confiables que se le ocurra son los siguientes:
1. Interfaz de red: algunos proveedores de servicios de datos lo proporcionarán, ya sea para el cargo o para el límite del número de veces, etc. El efecto no es ideal y la capacidad de control es pobre. Nunca lo he probado, como:
https://www.juhe.cn/docs/api/id/177/aid/601
o
http://apistore.baidu.com/apiworks/servateetail/1116.html
2. Analice la información de la página web en línea y obtenga situaciones de vacaciones: confíe en gran medida en las páginas web del sitio web analizadas, por lo que al seleccionar un sitio web, debe encontrar una un poco más confiable;
3. Según las Regulaciones Nacionales de vacaciones legales, ingrese al sistema todos los años, si los clientes no tienen miedo a los problemas. Todavía relativamente confiable;
Esta demostración elegirá la segunda para implementar;
2. Use htmlunit para analizar la información de la página web en línea para obtener situaciones de vacaciones
Al principio, utilicé Jsoup para analizar las páginas web, pero el efecto no fue ideal. Si la página web se generó dinámicamente, encontré varios problemas con JSOUP, por lo que la cambié a HTMLUNIT. En general, HTMLunit sigue siendo muy poderoso, puede simular la operación del navegador y se conoce como la implementación de código abierto de los navegadores Java;
Primero, vaya al sitio web oficial para descargar los paquetes JAR relevantes y lea los documentos relevantes:
http://htmlunit.sourceforge.net/
La página web que estoy analizando aquí es un calendario perpetuo de 3.6 millones:
http://hao.360.cn/rili/
La interfaz calendario es la siguiente:
El formato HTML analizado es el siguiente:
Pasos de implementación:
1. Cargue la página;
2. Luce para esperar a que se cargue la página (puede haber algunas páginas dinámicas, generadas usando JavaScript);
3. Anualización de contenido HTML de acuerdo con el formato de la página web y extrae información clave y la almacena en el objeto encapsulado;
Nota:
1. La dificultad radica en determinar si tomar unas vacaciones y el tipo de vacaciones. Dado que la página original no indica el tipo de vacaciones para cada día, la lógica aquí debe ser implementada por usted mismo. Consulte el código para obtener más detalles;
2. La razón de una variable de nombre de nombre más reciente estática es evitar las siguientes situaciones (la probabilidad de esta situación es extremadamente baja; PS: el método debe llamarse una vez al día antes de que la variable entre en vigencia):
Implementación del código:
Defina una clase de fecha china:
paquete com.pichen.tools.getdate; import java.util.date; public class Chinadate {/*** Gregorian Time*/Private Date solardate;/*** Lunar Day*/private String lunar;/*** Gregorian Day*/private String Solar;/*** "no se vacta";/*** si es una clase*/private boolean isworkflag = false; private boolean issaturday = false; private boolean issunday = false;/*** @return el solardate*/fecha pública getSolarDate () {return solardate;}/*** @param solardate el solardate para establecer*/public setsolardate (date solardate; solardate;}/*** @return el lunar*/public string getLunar () {return lunar;}/*** @param lunar the lunar to set*/public void setlunar (string lunar) {this.lunar = lunar;}/*** @return el solar*/public string string () {return solar;}/*** @param the set the set the set the sell the solar the set the sity the sity the sient solar setSolar (String Solar) {this.solar = solar;}/*** @return la isvacation*/public boolean isvacation () {return isvacation;}/*** @param isvacation la isvacation para establecer*/public void setVacation (boolean isvacation) {this.isvacation = isvacation;}/*** @return la hilera de vacaciones. getVacationName () {return VacationName;}/*** @param VacationName the VacationName para establecer*/public void setVacationName (String VacationName) {VacationName = VacationName;}/*** @Return The IsWorkFlag*/public bobolean isworkflag () { setworkflag (boolean isworkflag) {this.isworkflag = isworkflag;}/*** @return el ISSaturday*/public boolean issaturday () {return issaturday;}/*** @param issaturday eldido de set*/public void setsaturday (boolean issaturday) {this.issaturday = issaturday;}/}/}/*** boolean issunday () {return issunday;}/*** @param issunday The Issundday to set*/public void setsunday (boolean issunday) {this.issunday = issunday;}} Analiza la página web y llama a demostración, imprime los detalles de este mes y los detalles del día:
paquete com.pichen.tools.getdate; import java.io.ioException; import java.net.malFormedUrLeCeption; import java.text.dateFormat; import java.text.parseException; import java.text.simpedateFormat; import java.util.Arraylist; import java.util.date; com.gargoylesoftware.htmlunit.failinghttpstatuscodeeException; import com.gargoylesoftware.htmlunit.webclient; import com.gargoylesoftware.htmlunit.html.domnodeList; import Com.gargoylesoftware.htmlunit.html.htmlelement; import com.gargoylesoftware.htmlunit.html.htmlpage; public class Main {private static string Última vocación de voces = ""; public String getVocationName (DomNodeList <htmlelement> htmlelements, fecha de cadena) lanza SimpleDateFormat ("yyyy/mm/dd"); date paramDate = dateFormat.Parse (date); if (new date (). Gettime ()> = paramDate.gettime ()) {PasttimeFlag = verdadero;} // primer paso // jugde si puede obtener el nombre de vocación de la página html (int i = 0; i <htmlelements.ssize () (); i ++) {htmlelement element = htmlelements.get (i); if (element.getAttribute ("class"). indexOf ("vacaciones")! =-1) {boolean hitlag = false; string voteName = ""; for (; i <htmlelements.size (); i ++) {htmlelement lidiate = elementtmp.getAttribute ("date"); list <htmlelement> lunar = elementtmp.getElementsByAttribute ("span", "class", "lunar"); string lanartext = lunar.get (0) .EteText (); if (lanartext.equals ("anual el día")) {voationName = "New Year's New Year"; if (lanarText.equals ("Nochevieja") || lanartext.equals ("festival de primavera")) {voationName = "festival de primavera";} else if (lanarText.equals ("qingming")) {voationName = "festival de primavera";} else if (lanarText.equals ("día de trabajo internacional") {voationName "Spring festival"; if (lanarText.equals ("Dragon Boat Festival")) {VoationName = "Dragon Boat Festival";} else if (LanarText.equals ("Festival de Autumno Medio")) {VoationName = "Mid-Autumn Festival";} else if (LanARText.Equals ("National Day)) {VoationName =" National National Festival "; Día ";} if (Lidate.equals (date)) {hitFlag = true;} if (elementTmp.getAttribute (" class "). IndexOf (" vacaciones ") ==-1) {break;}} if (hitFlag == true & &! fail (raramente), obtenga de la última vocación nameif (rst.equals ("")) {system.out.println ("advertencia: no obtenga el nombre de vocación de la página html."); // puede juzgar por alguna regla simple // de la última vocación namersst = main.latestVocationName;} más si (pastortimeflag == verdadero) {// Actualización de la vocación " Main.latestVocationName = rst;} return rst;} public List <ninadate> getCurrentDateInfo () {webClient webClient = null; list <ninadate> datElist = null; try {dateFormat dateFormat = new SimpledAformat ("yyyy/mm/dd"); datelist WebClient (); htmlpage page = webClient.getPage ("http://hao.360.cn/rili/"); // espera (int k = 0; k <60; k ++) {if (! Page.getElementByid ("m-dates"). Astext (). Equals (")) segundos, esperando que la página se cargue ..., a veces, la página no puede recuperarse, unstable () //thread.sleep(8000); 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 (" fecha "))); if (element.getAttribute (" class "). indexOf (" Vacaciones ")! =-1) {chinadate.setVacation (true); chinadate.setVacationName (this.getVocationName (htmlelements, element.getAttribute ("date")));} if (element.getAttribute ("class"). indexOf ("fin de semana")! =-1 && element.getAttribute ("class"). indexOf ("último") ==-1) {chinadate.setsaturday (true);} if (element.getAttribute ("class"). índice de ("último (último (último (último (último (último (último (último (último (último (último (último (último fin de semana ")! =-1) {chinadate.setsunday (true);} if (element.getAttribute (" class "). indexOf (" trabajo ")! =-1) {chinadate.setworkflag (true);} más if (chinadate.issaturday () == falso && chinadate.issunday () == false && chinadate.isvacation () ) {chinadate.setworkflag (true);} else {chinadate.setworkflag (false);} dataList.Add (chinadate);}} capt (excepción e) {e.printstacktrace (); system.out.println ("Obtenga fecha de http://hao.360.cn/rili/ error ~");});} Finalmente {WebClient.Close ();} return dataList;} public chinadate getTodayInfo () {list <ninadate> dataList = this.getCurrentDateInfo (); dateFormat dateFormat = new SimpleDateFormat ("yyyy/mm/dd"); para (fecha de chinadate: DataList) {if (dateFormat.Format (date.getSolarDate ()). Equals (dateFormat.Format (new Date ()))) {return date;}} return new Chinadate ();} public static void main (string [] shallinghtttpStatUscodeException, malformado por malformación, Ioexception, interropertexception {args). DatElist = new Main (). GetCurrentDateInfo (); Chinadate Today = new Main (). GetTodayInfo (); DateFormat DateFormat = new SimpleDateFormat ("AYYYY/MM/DD"); System.out.println ("Detalles de este mes:"); para (Fecha de Chinadate: DataList) {System.out.println (dateFormat.Format (date.getSolardate ()) + "" + date.getVacationName());}System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- today.getSolarDate());System.out.println("Lunar: "+Today.getLunar ()); System.out.println (" Calendario Gregorian: "+Today.getSolar ()); System.out.println (" Nombre de vacaciones: "+Today.getVacationName ()); System.out.println (" Saturday: "+TOD AY.ISSaturday ();); System.out.Println (" es el domingo: "es el domingo "+Today.issunday ()); System.out.println (" está en vacaciones: "+Today.ISVACation ()); System.out.println (" es el día de trabajo: "+Today.isWorkFlag ()); System.out.println (" Últimas vacaciones que ocurrieron: "+Main.latestVocationName);}}} Ejecute el programa y el resultado es correcto: