1. Préface
J'ai rencontré un problème au travail récemment. Il y a une tâche chronométrée dans le backend. J'ai besoin d'utiliser Java pour juger les vacances statutaires, les vacances le week-end, le travail, etc. tous les jours. En fait, il est essentiellement impossible de juger les vacances statutaires de la Chine par la seule logique, car les vacances du pays peuvent être différentes chaque année et sont fixées par artificiel;
Vous ne pouvez donc compter que sur d'autres moyens, et les plus fiables que vous pouvez penser sont comme suit:
1. Interface réseau: Certains fournisseurs de services de données les fourniront, soit pour la charge, soit pour la limite du nombre de fois, etc. L'effet n'est pas idéal et la contrôlabilité est mauvaise. Je ne l'ai jamais essayé, comme:
https://www.juhe.cn/docs/api/id/177/aid/601
ou
http://apistore.baidu.com/apiworks/servcedetail/1116.html
2. Analyser les informations sur la page Web en ligne et obtenir des situations de vacances: comptez fortement sur les pages Web du site Web analysé, donc lors de la sélection d'un site Web, vous devriez en trouver un peu plus fiable;
3. Selon les règlements nationaux sur les vacances statutaires, entrez dans le système chaque année, si les clients n'ont pas peur des ennuis. Encore relativement fiable;
Cette démo choisira la seconde à mettre en œuvre;
2. Utilisez Htmlunit pour analyser les informations sur la page Web en ligne pour obtenir des situations de vacances
Au début, j'ai utilisé JSoup pour analyser les pages Web, mais l'effet n'était pas idéal. Si la page Web a été générée dynamiquement, j'ai rencontré divers problèmes avec JSoup, donc je l'ai changé en htmlunit. En général, Htmlunit est toujours très puissant, peut simuler le fonctionnement du navigateur et est connu sous le nom de mise en œuvre open source des navigateurs Java;
Tout d'abord, rendez-vous sur le site officiel pour télécharger les forfaits JAR pertinents et lire les documents pertinents:
http://htmlunit.sourceforge.net/
La page Web que j'analyse ici est un calendrier perpétuel de 3,6 millions:
http://hao.360.cn/rili/
L'interface du calendrier est la suivante:
Le format HTML analysé est le suivant:
Étapes de mise en œuvre:
1. Chargez la page;
2. Loop pour attendre que la page se charge (il peut y avoir des pages dynamiques, générées à l'aide de JavaScript);
3. Parses HTML Content en fonction du format de la page Web et extrait les informations clés et les stocke dans l'objet encapsulé;
Note:
1. La difficulté réside dans la détermination de l'opportunité de prendre des vacances et du type de vacances. Étant donné que la page d'origine n'indique pas le type de vacances pour chaque jour, la logique ici doit être implémentée par vous-même. Veuillez vous référer au code pour plus de détails;
2. La raison d'une variable statique DermterVocationName est d'empêcher les situations suivantes (la probabilité de cette situation est extrêmement faible; PS: la méthode doit être appelée une fois par jour avant que la variable ne prenne effet):
Implémentation du code:
Définissez une classe de date chinoise:
Package com.pichen.tools.getDate; import java.util.date; classe publique Chinadate {/ *** String grégorien * / Date privée solardate; / *** SOLAR LUNAR * / Private String Lunar; / *** Gregorian Day * / Private String Solar; / *** Si c'est un nom de vacances * / private boilean isvacation = false; / *** si c'est un nom de vacances * "Non-Vacation"; / *** si c'est une classe * / private booléen isworkflag = false; private boolean issAdday = false; private boolean issunday = false; / *** @return the solardate * / public date getolardate () {return solardate;} / *** @param solardate the solardate to striet * / public Void SetSola solardate;} / *** @return the lunar * / public String getlunar () {return lunar;} / *** @param lunar the lunar to Set * / public void setluNar (String lunar) {this.lunar = lunar;} / *** @return le solar * / public getolar () {return Solar set * / public void Setsolar (String Solar) {this.solar = solar;} / *** @return the isvacation * / public boolean isvacation () {return isvacation;} / *** @param isvacation the isvacation to set * / public void setvacation (boolean isvacation) {this.isvacation = isvacation;} VACKNAGE * / PUBLIC String getVacationName () {return VacationName;} / *** @param VACACKNAME Le nom de vacances pour définir * / public void setVacationName (String VacationName) {VACMAGNELAME = VACACKNAM set * / public void setworkflag (booléen isworkflag) {this.isworkflag = isworkflag;} / *** @return the issaturday * / public boolean issaturday () {return issAday;} / *** @param issaturday the Issaturday to Set * / public Void SetSaturday (boolean issaturday) {this.issaturday) issunday * / public booléen issunday () {return issunday;} / *** @param issunday the issunday to set * / public void setsunday (boolean issunday) {this.issunday = issunday;}} Analyse la page Web et appelle la démo, imprime les détails de ce mois et les détails de la journée:
package com.pichen.tools.getDate; 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. com.gargoylesoftware.htmlunit.failinghttpstatuscodeexception; import com.gargoylesoftware.htmlunit.webclient; import com.gargoylesoftware.htmlunit.html.domnodelist; import. com.gargoylesoftware.htmlunit.html.htmlpage; public class main {private static string static Derniter vocationName = "" public String getVocationName (domnodelist <htmlelement> htmlelements, string date) lance parseException {string rst = "; booolean pastimeflag = false; date SimpledateFormat ("Yyyy / mm / dd"); date paramdate = dateformat.parse (date); if (new Date (). GetTime ()> = paramdate.getTime ()) {pasttimeFlag = true;} // First Step // Jugde if peut obtenir le nom de vocation de HtMl i ++) {htmlelement element = htmlelements.get (i); if (element.getAttribute ("class"). indexof ("VACLAGES")! = - 1) {boolean hitflag = false; string votename = ""; for (; i <htmlelements.size (); i ++) {htmlelement elements lida = elementTmp.getAttribute ("Date"); list <htmlelement> lunar = elementTMP.getElementsByAttribute ("Span", "class", "lunar"); String lanartext = Lunar.get (0) .astext (); if (lanartext.equals ("else de la nouvelle année")) {Voationname = "" Equals "Else" Day de l'année ")) { if (lanartext.equals ("le réveillon du Nouvel An") || lanartext.equals ("festival de printemps")) {voationName = "Spring Festival";} else if (lanartext.equals ("Qingming")) {voationName = "Spring Festival";} else if (lanartext.equals ("Day du travail international") {voation) Festival ";} else if (lanartext.equals (" Dragon Boat Festival ")) {voationName =" Dragon Boat Festival ";} else if (lanartext.equals (" festival de milieu d'automne ")) {voationName =" Festival national ") {voation) Jour ";} if (lida.equals (date)) {hitflag = true;} if (elementTMP.getAttribute (" class "). Indexof (" VACLANCE ") == - 1) {Break;}} if (hitflag == true &&! VoationName.equals (" ") {rst = voationName; Break;}}} else {continent;} Échec (rarement), obtenez de la dernière vocation NameIF (RST.Equals ("")) {System.out.println ("AVERTISSEMENT: échouez à obtenir le nom de vocation de la page HTML."); // Vous pouvez juger par une règle simple // de la dernière vocation NAMERSST = MAIN.LATESTVOCOCATIONNAM Main.latestvocationName = RST;} return RST;} public list <HinAdate> GetCurrentDateInfo () {webClient webClient = null; list <HinAdate> dateList = null; try {dateformat dateFormat = new SimpledateFormat ("yyyy / mm / dd"); datelist = new Arinylist <););); WebClient (); htmlpage page = webclient.getpage ("http://hao.360.cn/rili/"); // attendez (int k = 0; k <60; k ++) {if (! Page.getElementByid ("m-dates"). En attendant que la page charge ..., parfois, la page peut être récupérée, instable () //thread.sleep(8000); élément: htmlelements) {chinadate chinadate = new chinAdate (); list <htmlement> lunar = element.getElementsByAttribute ("span", "class", "lunar"); list <htmlement> solar = element.getElementsByAttribute ("div", "class", ", "Solar"); chinadate.setlunar (lunar.get (0) .astext ()); chinadate.setsolar (solar.get (0) .astext ()); chinadate.setsolardate (dateformat.psse (element.getAttribute (" Date "))); if (element.getAttribute (" class "). indexof (" VACLAGES ")! = - 1) {chinadate.setVacation (true); chinadate.setVacationName (this.getVocationName (htmlelements, element.getAttribute ("date")));} if (element.getAttribute ("class"). indexof ("week-end")! = - 1 && élément.getAttribute ("class"). indexof ("last") == - 1) {chinadate.setSaturday ("Last);} if (element.getAttribute (" class "). week-end ")! = - 1) {chinadate.setsunday (true);} if (element.getAttribute (" class "). indexof (" work ")! = - 1) {chinadate.setworkflag (true);} else if (chinadate.issaturday () == false && chinadate.issunday () == false && chinadate.isvacation () == FACEL ) {chinadate.setworkflag (true);} else {chinadate.setworkflag (false);} datelist.add (chinadate);}} catch (exception e) {e.printstackTrace (); System.out.println ("Get Date à partir de http://hao.360.cn/rili/ Erreur ~");} Enfin {webClient.close ();} return datelist;} public chinadate getTodayInfo () {list <chinadate> dateList = this.getCurrentDateInfo (); 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) lance défaillante dateList = new Main (). getCurrentDateInfo (); chinadate Today = new Main (). getTodayInfo (); dateFormat DateFormat = new SimpledateFormat ("Details de ce mois:"); pour (chinadate date: dateList) {System.out.println (dateformat.format (date.getsolardate ()) + "" + date.getVacationName ());} System.out.println ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "+ Today.getLunar ()); System.out.println (" Gregorian Calendar: "+ Today.getsolar ()); System.out.println (" Nom de vacances: "+ Today.getVacationName ()); System.out.println (" Samedi: "+ Tod Ay.issaturday ()); System.out.Println (" "est le dimanche: "+ Today.issunday ()); System.out.println (" est en vacances: "+ Today.isvacation ()); System.out.println (" est le jour de travail: "+ Today.isworkFlag ()); System.out.println (" Dernières vacances qui se sont produites: "+ main.latestvocationName);}} Exécutez le programme et le résultat est correct: