1. مقدمة
لقد واجهت مشكلة في العمل مؤخرًا. هناك مهمة محددة في الخلفية. أحتاج إلى استخدام Java للحكم على الأعياد القانونية ، وعطلات نهاية الأسبوع ، والعمل ، وما إلى ذلك كل يوم. في الواقع ، من المستحيل في الأساس الحكم على الأعياد القانونية للصين من خلال المنطق وحده ، لأن العطلات في البلاد قد تكون مختلفة كل عام ويتم تحديدها بشكل مصطنع ؛
لذلك يمكنك الاعتماد فقط على وسائل أخرى ، وكلما كانت أكثر موثوقية يمكنك التفكير فيها هي كما يلي:
1. لم أجربها أبدًا ، مثل:
https://www.juhe.cn/docs/api/id/177/aid/601
أو
http://apistore.baidu.com/apiworks/servedetail/1116.html
2. قم بتحليل معلومات صفحة الويب عبر الإنترنت والحصول على حالات العطلات: الاعتماد بشدة على صفحات الويب المحلية ، لذلك عند اختيار موقع ويب ، يجب أن تجد موقعًا أكثر موثوقية قليلاً ؛
3. وفقًا للوائح الوطنية في أيام العطل القانونية ، أدخل النظام كل عام ، إذا لم يكن العملاء يخافون من المتاعب. لا تزال موثوقة نسبيا
سيختار هذا العرض الثاني لتنفيذها ؛
2. استخدم htmlunit لتحليل معلومات صفحة الويب عبر الإنترنت للحصول على حالات العطلات
في البداية ، استخدمت JSoup لتحليل صفحات الويب ، لكن التأثير لم يكن مثاليًا. إذا تم إنشاء صفحة الويب ديناميكيًا ، فقد واجهت مشاكل مختلفة مع JSoup ، لذلك قمت بتغييرها إلى HTMLUnit. بشكل عام ، لا يزال HTMLUnit قويًا للغاية ، ويمكنه محاكاة تشغيل المتصفح ، ويعرف باسم تنفيذ المصدر المفتوح لمتصفحات Java ؛
أولاً ، انتقل إلى الموقع الرسمي لتنزيل حزم الجرة ذات الصلة وقراءة المستندات ذات الصلة:
http://htmlunit.sourceforge.net/
صفحة الويب التي أقوم بتحليلها هنا هي تقويم دائم 3.6 مليون:
http://hao.360.cn/rili/
واجهة التقويم هي كما يلي:
تنسيق HTML المحلل هو كما يلي:
خطوات التنفيذ:
1. تحميل الصفحة ؛
2. حلقة لانتظار الصفحة للتحميل (قد يكون هناك بعض الصفحات الديناميكية ، التي يتم إنشاؤها باستخدام JavaScript) ؛
3. تحليل محتوى HTML وفقًا لتنسيق صفحة الويب ويستخرج معلومات المفتاح ويخزنها في الكائن المغلف ؛
ملحوظة:
1. تكمن الصعوبة في تحديد ما إذا كان يجب أخذ إجازة ونوع الإجازة. نظرًا لأن الصفحة الأصلية لا تشير إلى نوع الإجازة لكل يوم ، يجب تنفيذ المنطق هنا من قبل نفسك. يرجى الرجوع إلى الكود للحصول على التفاصيل ؛
2. السبب في متغير أحدث staticvocationName هو منع المواقف التالية (احتمال هذا الموقف منخفض للغاية ؛ ps: يجب استدعاء الطريقة مرة واحدة قبل اليوم قبل أن تدخل المتغير):
تنفيذ الكود:
تحديد فئة التاريخ الصيني:
حزمة com.pichen.tools.getDate ؛ استيراد java.util.date ؛ الطبقة العامة chinadate {/*** time gregorian*/solardate date private ؛/*** lunar day*/private string lunar ؛/*** gregorian day*/private String solar ؛ "عدم وجود عوامل" ؛/*** ما إذا كان فئة*/منطقية خاصة iSworkflag = false ؛ issaturday boolean private = false ؛ private boolean issunday = false ؛ solardate ؛}/*** @RETURN the Lunar*/public String getLunar () {return lunar ؛}/*** param lunar the lunar to set*/public void setlunar (string lunar) {this.lunar = lunar ؛ set*/public void setSolar (String Solar) {this.solar = solar ؛}/*** @RETURN ISVACATION*/public boolean isVacation () {return isVacation ؛ The VacationName*/public String getVacationName () {return vacationName ؛}/*** param vacationName اسم العطلات لتعيين*/public void setVacationName (string vacationName) {vacationName = vacationName ؛}/*** return the isworkflag*/public boolean isworkflag () { SET*/public void setworkflag (boolean isworkflag) {this.isworkflag = iSworkFlag ؛}/*** @RETURN isaturday*/public boolean issaturday () {return issaturday ؛}/*** param issaturday issunday*/public boolean issunday () {return issunday ؛}/*** param issunday the issunday لتعيين*/public void setsunday (boolean issunday) {this.issunday = issunday ؛}} يموت صفحة الويب ، ومكالمات العرض التوضيحي ، يطبع تفاصيل هذا الشهر ، وتفاصيل اليوم:
package com.pichen.tools.getDate ؛ استيراد java.io.ioException ؛ استيراد java.net.malformedurlexception ؛ استيراد java.text.dateformat ؛ استيراد java.text com.gargoylesoftware.htmlunit.failinghttpstatuscodeexception ؛ import com.gargoylesoftware.htmlunit.webclient ؛ import com.gargoylesoftware.htmlunit.html.domnodelist com.gargoylesoftware.htmlunit.html.htmlpage ؛ الفئة العامة الرئيسية {private static string أحدث focationName = "" SimpleDateFormat ("Yyyy/mm/dd") ؛ Date ParamDate = dateFormat.Parse (Date) ؛ if (Date () i ++) {htmlelement element = htmlelements.get (i) ؛ if (element.getAtTribute ("class"). indexof ("faciture")! =-1) {boolean hitflag = false ؛ lidate = elementtmp.getattribute ("date") ؛ قائمة <htmlelement> lunar = elementtmp.getElementsByattribute ( if (lanartext.equals ("عشية السنة الجديدة") || lanartext.equals ("مهرجان الربيع")) {vOpationName = "Spring Festival" ؛} if (lanartext.equals ("qingming")) إذا كان (lanartext.equals ("مهرجان قارب التنين"))) {votationName = "Dragon Boat Festival" ؛} آخر إذا (lanartext.equals ("مهرجان Mid-Autumn")) اليوم "؛} if (lidate.equals (date)) {hitflag = true ؛} if (elementtmp.getAttribute (" class "). indexof (" acaction ") ==-1) {break ؛}}}} if (intflag == true &&! فشل (نادرًا) ، احصل من أحدث اسم مهنة (rst.equals ("")) {system.out.println ("تحذير: فشل في الحصول على اسم المهنة من صفحة html.") ؛ main.lateStVocationName = rst ؛} rest rst ؛} القائمة العامة <ChinAdate> getCurrentDateInfo () {webclient webclient = null ؛ list <ChinAdate> datelist = null ؛ try {dateFormat dateFormat = new simpledatformat ("yyyy/mm/dd") webclient () ؛ htmlPage page = webclient.getPage ("http://hao.360.cn/rili/") ؛ // انتظر (int k = 0 ؛ k <60 ؛ k ++) {if (! page.etelementbyid ("m-dates"). astext (). ثواني ، في انتظار تحميل الصفحة ... ، في بعض الأحيان ، قد لا يتم استرداد الصفحة ، غير مستقر () //thread.sleep(8000) ؛ لـ (htmlelement element: htmlelements) {chinadate chinadate = new chinadate () ؛ قائمة <htmlelement> lunar = element.getElementsByAttribute ( "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 (" Facكس ")! =-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.getattrime ( عطلة نهاية الأسبوع ")! =-1) {chinadate.setsunday (true) ؛} if (element.getAttribute (" class "). indexof (" work ")! =-1) {chinadate.setworkflag (true) ؛} آخر إذا (chinadate.issaturday () ) {chinadate.setworkflag (true) ؛} آخر {chinadate.setworkflag (false) ؛} datelist.add (chinadate) ؛}} catch (استثناء e) {eprintstacktrace () ؛ system.out.println ("الحصول على تاريخ من http://hao.360.cn/rili/ ~") ؛ أخيرًا {webclient.close () ؛} إرجاع datelist ؛} public chinadate getTodayInfo () {list <ChinAdate> datelist = this.getCurrentDateInfo () ؛ dateFormat dateFormat = new SimpleDateFormat ("yyyy/mm/dd") DateList) {if (dateFormat.format (date.getsolardate ()) datelist = new main (). getCurrentDateInfo () ؛ chinadate اليوم = جديد () DateList) {system.out.println (dateFormat.format (date.getSolardate ()) + "" + Date.getVacationName ()) ؛} system.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "+اليوم. "+اليوم. قم بتشغيل البرنامج والنتيجة صحيحة: