1。序文
私は最近職場で問題に遭遇しました。バックエンドには時限タスクがあります。 Javaを使用して、毎日法定休日、週末の休日、仕事などを判断する必要があります。実際、国内の休日は毎年異なっており、人為的に設定されている可能性があるため、論理だけで中国の法定休日を判断することは基本的に不可能です。
したがって、あなたは他の手段にのみ頼ることができ、あなたが考えることができるより信頼できるものは次のとおりです。
1。ネットワークインターフェイス:一部のデータサービスプロバイダーは、充電または回数などの制限に対してそれを提供します。効果は理想的ではなく、制御可能性が低くなります。私はそれを試したことがありません:
https://www.juhe.cn/docs/api/id/177/aid/601
または
http://apistore.baidu.com/apiworks/servicedetail/1116.html
2。オンラインでWebページ情報を分析して休日の状況を取得します。解析されたWebサイトのWebページに大きく依存しているため、Webサイトを選択するときは、わずかに信頼性の高いものを見つける必要があります。
3。法定休日に関する国家規制によると、顧客がトラブルを恐れていない場合は、毎年システムに入ります。まだ比較的信頼できます。
このデモは、実装する2番目のデモを選択します。
2。htmlunitを使用してWebページ情報をオンラインで分析して、休日の状況を取得する
最初はJSOUPを使用してWebページを解析しましたが、効果は理想的ではありませんでした。 Webページが動的に生成された場合、JSoupでさまざまな問題が発生したため、HTMLunitに変更しました。一般に、HTMLunitは依然として非常に強力で、ブラウザの操作をシミュレートでき、Javaブラウザーのオープンソース実装として知られています。
まず、公式Webサイトにアクセスして、関連するJARパッケージをダウンロードし、関連するドキュメントをお読みください。
http://htmlunit.sourceforge.net/
ここで私が分析しているWebページは、360万の永久カレンダーです。
http://hao.360.cn/rili/
カレンダーインターフェイスは次のとおりです。
解析されたHTML形式は次のとおりです。
実装手順:
1。ページをロードします。
2。ページがロードされるのを待つループ(JavaScriptを使用して生成された動的ページがいくつかある場合があります)。
3。Webページ形式に従ってHTMLコンテンツを解析し、重要な情報を抽出し、カプセル化されたオブジェクトに保存します。
注記:
1.困難は、休暇をとるか休暇をとるかを決定することにあります。元のページは毎日の休暇の種類を示していないため、ここのロジックは自分で実装する必要があります。詳細については、コードを参照してください。
2。静的な最新のVocationName変数の理由は、次の状況を防ぐことです(この状況の確率は非常に低いです; PS:この方法は、変数が有効になる前に1日1回呼び出す必要があります):
コード実装:
中国の日付クラスを定義します。
パッケージcom.pichen.tools.getDate;インポートjava.util.date; public class chinadate {/***グレゴリアンタイム*/プライベートデートソラルダート;/***プライベートストリングデイ*/***グレゴリオデイ***プライベートストリングソラル; "nonvacation";/***それがクラスであるかどうか*/private boolean isworkflag = false; private boolean issaturday = false; private boolean issunday = false;/*** @ @return the solardate*/public date getsolardate(){return solardate;}/*** @param solardate set set setolardate solardate;}/*** @return the lunar*/public string getlunar(){return lunar;}/*** @param lunar the lunar the lunar to set*/public void setlunar(string lunar){this.lunar = lunar;}/*** @return getsolar; set*/public void setsolar(string solar){this.solar = solar;}/*** @return the isvacation*/public boolean isvacation(){return isvacation;}/*** @param isvacation to isvacation to set*/public void setvacation(boolean isvacation; vacaceName*/public String getVacationName(){return vacaceName;}/*** @param vacaceName to set*/public void setvacationName(string vacaceName){vacationname;}/*** @return the isworkflag*/public boolean isworkflag set*/public void setworkflag(boolean isworkflag){this.isworkflag = isworkflag;}/*** @return the issaturday*/public boolean issaturday(){return issaturday;}/*** @param isaturday the issaturday to set*/public void setSaturday Issaturday;}/*** @return the Issunday*/public boolean issunday(){return issunday;}/*** @param issunday to set*/public void setsunday(boolean issunday){this.issunday = issunday;}}}} Webページを解析し、デモを呼び出し、今月の詳細とその日の詳細を印刷します。
パッケージ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.util.util.util.util.util.util.util.util.util.util.util.util.util.util.util.util.itil. java.util.list; Import com.gargoylesoftware.htmlunit.failinghttpstatuscodeexception; import com.gargoylesoftware.htmlunit.webclient; Import com.gargoylesoftware.htmlunit.html.domnodelist; Import; com.gargoylesoftware.htmlunit.htmlelement; Import com.gargoylesoftware.htmlunit.html.htmlpage; public class main {private static string rabt vocutionname = ""; public string getVocationName(domnodelist <htmlement <htmlement> htmlement> htmlement> "; boolean pasttimeflag = false; dateFormat dateFormat = new SimpleDateFormat(" yyyy/mm/dd "); date paramdate = dateformat.parse(date); if(new date()。 i <htmlements.size(); i ++){htmlelement.get(i); if(element.getTribute( "class")。 = htmLelements.get(i); string lidate = elementtmp.getattribute( "date"); list <htmlement> lunar = elementtmp.getelementsbyattribute( "span"、 "class"、 "lunar"); string lanartext = lunar.get(0).astext(); if(lanartext( = "新年の日";} else if(lanartext.equals( "新年")|| lanartext.equals( "Spring Festival")){voationname = "Spring Festival";} else if(lanartext.equals( "Qingming")){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 ";} ells if(lanartext.equals(" National Day ") day ";} if(lidate.equals(date)){hitflag = true;} if(elementtmp.getattribute(" class ")。失敗(まれに)、最新のVocation namefif(rst.equals( "")){system.out.println( "警告:htmlページから職業名を取得できません。"); main.latestVocationName = rst;} return rst;} public list <shinadate> getCurrentDateInfo(){webclient webclient = null; list <shinadate> datelist = null; try {dateformat dateformat = new SimpledateFormat( " webclient(); htmlpage page = webclient.getPage( "http://hao.360.cn/rili/"); // wait(int k = 0; k <; k ++){if(!page.getelementbyid( "m-dates")。ページがロードされるのを待っています...時々、ページが取得されない場合があります()//thread.sleep(8000); 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")週末 ") ){chinadate.setworkflag(true);} else {chinadate.setworkflag(false);} datelist.add(chinadate);}}} catch(exception e){e.printstacktrace(); out.println( "最後に{webclient.close();} return datelist;} public chinadate gettodayinfo(){list <shinadate> datelist = this.getCurrentDateInfo(); dateFormatFormat = new SimpledateFormat( "yyyy/mm/dd"); datelist){if(dateformat.format(date.getSolardate())。 datelist = new Main()。getCurrentDateInfo(); chinadate today = new main()。gettodayinfo(); dateformat dateformat = new simpledateFormat( "yyyy/mm/dd"); system.out.println( "今月の詳細:"); datelist){system.out.println(dateformat.format(date.getSolardate()) + "" + date.getVacationName());}System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- today.getSolarDate());System.out.println("Lunar: "+today.getlunar()); system.out.println(" gregorian calendar: "+today.getsolar()); system.out.println(" holiday name: "+today.getvacationname()); out.println("土曜日: "+tod ay.issatur()); "+issunday()); system.out.println(" Is in vacation: "+today.isvacation()); system.out.println(" is working day: "+today.isworkflag()); out.println("最新の休日が発生した: "+main.latestvocationName);}}}プログラムを実行すると、結果は正しいです。