1. Vorwort
Ich habe in letzter Zeit ein Problem bei der Arbeit gestoßen. Es gibt eine zeitgesteuerte Aufgabe im Backend. Ich muss Java verwenden, um die gesetzlichen Feiertage, Wochenendfeiertage, Arbeit usw. jeden Tag zu beurteilen. Tatsächlich ist es im Grunde unmöglich, die gesetzlichen Feiertage Chinas allein durch Logik zu beurteilen, da die Ferien im Land jedes Jahr unterschiedlich sein können und von künstlich festgelegt werden.
Sie können sich also nur auf andere Mittel verlassen, und je zuverlässiger Sie sich vorstellen können, sind wie folgt:
1. Netzwerkschnittstelle: Einige Datendienstanbieter bieten sie entweder für die Gebühr oder für die Grenze der Häufigkeit usw. Ich habe es nie versucht, wie:
https://www.juhe.cn/docs/api/id/177/aid/601
oder
http://apistore.baidu.com/apiworks/servicedetail/1116.html
2. Analysieren Sie die Webseiteninformationen online und erhalten Sie Urlaubssituationen: Verlassen Sie sich stark auf die Webseiten der Parsen -Website. Wenn Sie also eine Website auswählen, sollten Sie eine etwas zuverlässigere finden.
3. Geben Sie nach den nationalen Vorschriften zu gesetzlichen Feiertagen jedes Jahr das System ein, wenn Kunden keine Angst vor Ärger haben. Noch relativ zuverlässig;
Diese Demo wird den zweiten auswählen, der implementiert wird.
2. Verwenden Sie HTMLunit, um Webseiteninformationen online zu analysieren, um Urlaubssituationen zu erhalten
Zu Beginn habe ich JSOUP verwendet, um Webseiten zu analysieren, aber der Effekt war nicht ideal. Wenn die Webseite dynamisch generiert wurde, habe ich auf verschiedene Probleme mit JSOUP gestoßen, also habe ich sie in HTMLunit geändert. Im Allgemeinen ist HTMLunit immer noch sehr leistungsfähig, kann den Betrieb des Browsers simulieren und als Open -Source -Implementierung von Java -Browsern bekannt.
Gehen Sie zunächst auf die offizielle Website, um die entsprechenden JAR -Pakete herunterzuladen und die entsprechenden Dokumente zu lesen:
http://htmlunit.sourceforge.net/
Die Webseite, die ich hier analysiere, ist ein 3,6 Millionen ewiger Kalender:
http://hao.360.cn/rili/
Die Kalenderschnittstelle lautet wie folgt:
Das analysierte HTML -Format lautet wie folgt:
Implementierungsschritte:
1. Laden Sie die Seite;
2. Schleife, um auf das Laden der Seite zu warten (es kann einige dynamische Seiten geben, die mit JavaScript erzeugt werden);
3.. Parses HTML -Inhalt entsprechend dem Webseitenformat und extrahiert Schlüsselinformationen und speichert sie in das eingekapselte Objekt;
Notiz:
1. Die Schwierigkeit besteht darin, festzustellen, ob sie Urlaub machen und die Art des Urlaubs. Da die Originalseite nicht die Art des Urlaubs für jeden Tag angibt, muss die Logik hier selbst implementiert werden. Weitere Informationen finden Sie im Code.
2. Der Grund für eine statische neueste VocationName -Variable besteht darin, die folgenden Situationen zu verhindern (die Wahrscheinlichkeit dieser Situation ist extrem niedrig; PS: Die Methode muss einmal täglich vor der Variablen wirksam):
Code -Implementierung:
Definieren Sie eine chinesische Date -Klasse:
paket com.pichen.tools.getDate; import Java.util.date; öffentliche Klasse Chinadate {/*** Gregorian Time*/Private Date Solardate;/*** Mondtag*/privat String Mondarn;/*** Gregorian Day*/privat String Solar;/*** Wie es ist, ist ein Urlaub. "Nicht-Tätigkeit";/*** ob es sich um eine Klasse handelt*/privat boolean isworkflag = false; Solardate;}/*** @return the mondRar*/public String getlunar () {return lunar;}/*** @param lunar der mondar zu setzen 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;}/*** @return the VacationName*/public String GetVacationName () {return vacationName;}/*** @param vacationName the VacationName zu setzen SET*/public void setworkFlag (boolean isworkFlag) {this.isworkFlag = isworkFlag;}/*** @return the issaturday IssUnday*/public boolean issUnday () {return isuntay;}/*** @param issUntay Der IssUnday Set*/public void setsUnday (boolean issUnday) {this.issunday = issUnday;}}} Analysiert die Webseite und ruft Demo an, druckt die Details dieses Monats und die Details des Tages:
Paket com.pichen.tools.getDate; importieren java.io.ioxception; import Java.net.malformedurlexception; import Java.text.DateFormat; import Java.Text.ParseException; importieren Java.Text.SimpledateFormat; import. com.gargoylesoftware.htmlunit.failinghttpStatusCodeexception; import com.gargoylesoftware com.gargoylesoftware.htmlunit.html.htmlpage; public class main {private statische String -String -VocationName = ""; public String GetVocationName (Domnodelist <htmlelement> htmlelements, String -Datum) verleiht ParseException {String rst = "; SimpleDateFormat ("yyyy/mm/dd"); Datum paramdate = dateFormat.Parse (Datum); if (new Date (). i ++) {htmlelement element = htmlelements.get (i); if (element.getAttribute ("class"). IndexOf ("Vacation")! htmlelements.get (i); String lides = elementtmp.getAttribute ("Datum"); Liste <htmlelement> lunar = elementtmp.getElementsbyattribute ("span", "class", "class", "lunar"); String lanartext = lunar.get (0) .Astext (); = "New Year's Day";}else if(lanarText.equals("New Year's Eve")||lanarText.equals("Spring Festival")){voationName = "Spring Festival";}else if(lanarText.equals("Qingming")){voationName = "Spring Festival";}else if(lanarText.equals("International Labor Day")){voationName = "Spring Festival";} else if (lanartext.equals ("Dragon Boat Festival") {voationName = "Dragon Boat Festival";} else if (lanartext.equals ("Mid-Autumn Festival")) {VoationName = "Mid-Autumn Festival"; Tag ";} if (lidate.equals (Datum)) {hitflag = true;} if (elementtmp.getAtTribute (" class "). Indexof (" Vacation ") ==-1) {break;}} if (hitflag == true &&! Voationname.equals (") {rst = voationname; Fail (selten), holen Sie sich vom neuesten Berufungsnamen (rst.equals ("") {System.out.println ("WARNUNG: FAIL ANGEHEN SIE VORTEILEN NAME AUS HTML PAGE. Main.latestVocationName = rst;} return rst;} publiclist <chinAdate> getCurrentDateInfo () {Webclient webclient = null; liste <chinadate> datelist = null; try {DateFormat DateFormat = new SimpledateFormat ("yyyy/mm/mm/mm/dd");); Webclient (); Sekunden, die auf die Seite warten ... manchmal wird die Seite nicht abgerufen, instabil () //Thread.sleep(8000); 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 "(" Datum "))); if (element.getAtTribute (" Klasse "). Indexof (" Vacation ")! element.getAttribute ("date")));} if (element.getAttribute ("class"). indexof ("weekend")! Weekend ")! ) {chinadate.setworkFlag (true);} else {chinadate.setworkFlag (false);} datelist.add (chinadate);}} catch (Ausnahme e) {e.printstacktrace (); System.out.println ("Get Date von http:/hao.360.cn/rili/r.}; Schließlich {webclient.close ();} return datelist;} public chinadate getTodayInfo () {list <chinadate> datelist = this.getCurrentdatEnfo (); DateFormat DateFormat = new SimpledateFormat ("YYY/MM/DD"); 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 ("Details dieses Monats:"); Datelist) {System.out.println (DateFormat.format (Date.getSolardate ()) + "" + + Datum.getVacationName ());} System.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ "+heute "+heute Führen Sie das Programm aus und das Ergebnis ist korrekt: