1. Предисловие
Я недавно столкнулся с проблемой на работе. В бэкэнде есть задача. Мне нужно использовать Java, чтобы каждый день судить о законодательных праздниках, праздниках выходных, работы и т. Д. Фактически, в основном невозможно судить о законодательных праздниках Китая только через логику, потому что праздники в стране могут отличаться с каждым годом и создаются искусственно;
Таким образом, вы можете полагаться только на другие средства, а более надежные, о которых вы можете придумать:
1. Сетевой интерфейс: некоторые поставщики услуг данных будут предоставлять его, либо для заряда, либо для предела количества раз и т. Д. Эффект не является идеальным, а управляемость плохая. Я никогда не пробовал, например:
https://www.juhe.cn/docs/api/id/177/aid/601
или
http://apistore.baidu.com/apiworks/serviceedetail/1116.html
2. Анализ информации о веб -странице онлайн и получить праздничные ситуации: в значительной степени полагайтесь на веб -страницы веб -сайта проанализированных веб -сайтов, поэтому при выборе веб -сайта вы должны найти немного более надежную;
3. Согласно национальным правилам по закону праздники, вводите систему каждый год, если клиенты не боятся проблем. Все еще относительно надежно;
Эта демонстрация выберет второй для реализации;
2. Используйте HTMlunit для анализа информации о веб -странице онлайн, чтобы получить праздничные ситуации
Вначале я использовал jsoup для анализа веб -страниц, но эффект не был идеальным. Если веб -страница была сгенерирована динамически, я столкнулся с различными проблемами с JSoup, поэтому я изменил ее на Htmlunit. В целом, HTMlunit все еще очень мощный, может имитировать работу браузера и известен как реализация с открытым исходным кодом браузеров Java;
Во -первых, перейдите на официальный веб -сайт, чтобы загрузить соответствующие пакеты JAR и прочитать соответствующие документы:
http://htmlunit.sourceforge.net/
Веб -страница, которую я анализирую здесь, - это 3,6 миллиона вечного календаря:
http://hao.360.cn/rili/
Интерфейс календаря выглядит следующим образом:
Проанализированный формат HTML выглядит следующим образом:
Шаги внедрения:
1. Загрузите страницу;
2. Цикл, чтобы дождаться загрузки страницы (могут быть некоторые динамические страницы, сгенерированные с использованием JavaScript);
3. Диаграммы HTML -контент в соответствии с форматом веб -страницы и извлекает ключевую информацию и хранит ее в инкапсулированный объект;
Примечание:
1. Сложность заключается в определении того, взять ли отпуск и тип отпуска. Поскольку исходная страница не указывает тип отпуска для каждого дня, логика здесь должна быть реализована сами. Пожалуйста, обратитесь к коду для получения подробной информации;
2. Причина статической переменной AndalVocationName - это предотвращение следующих ситуаций (вероятность этой ситуации чрезвычайно низкая; PS: метод должен вызывать раз в день до того, как переменная вступит в силу):
Реализация кода:
Определите китайский класс даты:
пакет com.pichen.tools.getdate; import java.util.date; public class chinadate {/*** gregorian time*/private date solardate;/*** Лунный день*/private string lunar;/*** Грегорианский день*/private solar;/***, будь то праздник*/private boolean isvacation = false; «Непакация»;/***, будь то класс*/private boolean isWorkflag = false; private boolean iSsaturday = false; private boolean iSsunday = false;/*** @retur solardate;}/*** @return the lunar*/public String getlunar () {return lunar;}/*** @param lunar the lunar to set*/public void setlunar (String lunar) {this.lunar = lunar;}/*** @retur setSolar (String Solar) {this.solar = solar;}/*** @return the isvacation*/public boolean isvacation () {return isvacation;}/*** @param iSvacation Isvacation для установки*/public void setVacation (boolean isVacation) {this.isvacation = isVacation; String getVacationName () {return vestireName;}/*** @param vestirename the vationname для установки*/public void setVacationName (String vationName) {vecationName = vationName;}/*** @retur SET*/public void setWorkflag (boolean isWorkflag) {this.isWorkflag = isWorkflag;}/*** @return the Issaturday*/public boolean issatureday () {return issatureday;}/*** @param issatureday the issatureday, чтобы установить*/public void statureday (issaturday usaturday) Issunday*/public boolean issunday () {return issunday;}/*** @param issunday the issunday для установки*/public void setsunday (boolean issunday) {this.issunday = issunday;}} Подготовка веб -страницы и вызывает демонстрацию, печатает подробности этого месяца и детали дня:
пакет com.pichen.tools.getdate; импорт java.io.ioexception; import java.net.malformedurlexception; импорт java.text.dateformat; импорт java.text.parseexception; импорт java.text.simpledateformat; импорт java.util.arraylist; import java.ut.date; com.gargoylesoftware.htmlunit.failinghttpstatusexexception; import com.gargoylesoftware.htmlunit.webclient; импорт com.gargoylesoftware.htmlunit.html.htmlist; import com.gargoyleware.htmlunit.htmlemlist; импорт. com.gargoylesoftware.htmlunit.html.htmlpage; public class main {private static string andal ankationname = ""; public String getVocationName (domnodelist <htmlelement> htmlelements, date string) throws parseexception {string rst = "; SimpleDateFormat ("yyyy/mm/dd"); date paramdate = dateformat.parse (date); if (new date (). Gettime ()> = paramdate.gettime ()) {pasttimeflag = true;} // Первый шаг // jugde, если можно получить или именем голоса (int i = 0; i ++) {htmlelement element = htmlelements.get (i); if (element.getattribute ("class"). Indexof ("Отпуск")! htmlelements.get (i); string lidate = elementtmp.getattribute («date»); list <htmlelement> lunar = elementtmp.getelementsbyattribut День года ";} else if (lanartext.equals (" Новый год канун ") || lanartext.equals (" Spring Festival ")) {VoationName =" Spring Festival ";} else if (lanartext.equals (" Qingming ") {VoationName =" Spring Festiv Day ")) {VoationName =" Spring Festival ";} else if (lanartext.equals (" фестиваль лодок драконов ")) {voationname =" фестиваль лодок-драконов ";} else if (lanartext.equals (" Средний фестиваль " Day ")) {voationname =" National Day ";} if (lidate.equals (date)) {hitflag = true;} if (elementtmp.getattribute (" class "). Indexof (" Отпуск ") ==-1) {break;}} if (hitflag == true &&! voationname; break;}} else {contul;}} // Если первый шаг не удастся (редко), Get от последнего названия призваний (rst.equals ("")) {System.out.println ("ПРЕДУПРЕЖДЕНИЕ: не удастся получить название призвания от html -страницы."); // Вы можете судить по какому -либо простому правилу // от последнего VAMEST namerSST. if (pasttimeflag == true) {// Обновление «текущее время и самое последнее видимое имя праздничного имени. SimpleDateFormat ("yyyy/mm/dd"); datelist = new ArrayList <chinadate> (); webclient = new webclient (); htmlpage page = webclient.getpage ("http://hao.360.cn/rili/"); // ждать (int k = 0; k <60; k ++) {if (! page.getElementById ("m-Dates"). ASText (). Equals ("")) Break; Thread.slep (1000);} // Спит в течение 8 секунд, ожидая загрузки страницы ..., иногда, страница не может быть получена, нестабильно () //thread.slesing(8000); page.getElementById ("m-даты"). getElementsbytagname ("li"); // system.out.println (htmlelements.size ()); "Lunar"); List <htmlelement> solar = element.getelementsbyattribute ("div", "class", «Солнечный»); chinadate.setlunar (lunar.get (0) .astext ()); chinadate.setsolar (solar.get (0) .astext ()); chinadate.setsolardate (dateformat.parse (element.getattribute (» Дата "))); if (element.getAttribute (" class "). Indexof (" Отпуск ")! =-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.setsatarday (true);} if (element.getattribute ("class") выходные ")! =-1) {chinadate.setsunday (true);} if (element.getattribute (" class "). indexof (" work ")! =-1) {chinadate.setworkflag (true);} else if (chinadate.issaturday () == false && chinadate.issunday () == false. ) {chinadate.setworkflag (true);} else {chinadate.setworkflag (false);} datelist.add (chinadate);}} catch (исключение e) {e.printstacktrace (); System.out.println («Получить дату от http://hao.360.cn/rili ~"); Наконец {webclient.close ();} return datelist;} public chinadate getTodayinfo () {list <Chinadate> datelist = this.getCurrentDateInfo (); dateformat dateformat = new Sommoustedateformat ("yyyy/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 waillinghttpstatusexexcept 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 ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "+сегодня.getlunar ()); System.out.println (" Грегорианский календарь: "+сегодня.getsolar ()); System.out.println (" Праздничный название: "+сегодня.getVacationName ()); System.out.println (" Суббота: "+tod ay.issatureday (); System.out.out.ous.println (" Sunday: "+tod ay.issatureday ();); «+сегодня. Запустите программу, и результат верен: