一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

2020-03-24 13:33風(fēng)一樣的碼農(nóng) JAVA教程

這篇文章主要介紹了基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法 的相關(guān)資料,需要的朋友可以參考下

一、前言

最近工作上遇到一個問題,后端有一個定時任務(wù),需要用JAVA每天判斷法定節(jié)假日、周末放假,上班等情況,其實想單獨通過邏輯什么的去判斷中國法定節(jié)假日的放假情況,基本不可能,因為國家每一年的假期可能不一樣,是人為設(shè)定的;

所以只能依靠其它手段,能想到的比較靠譜的如下:

1.網(wǎng)絡(luò)接口:有些數(shù)據(jù)服務(wù)商會提供,要么是收錢的,要么是次數(shù)限制,等等各種問題,效果不理想,可控性差,我也沒試過,如:

https://www.juhe.cn/docs/api/id/177/aid/601

或者

http://apistore.baidu.com/apiworks/servicedetail/1116.html

2.在線解析網(wǎng)頁信息,獲取節(jié)假日情況:嚴重依賴被解析的網(wǎng)站網(wǎng)頁,所以在選取網(wǎng)站的時候,要找稍微靠譜點的;

3.根據(jù)國家規(guī)定的法定節(jié)假日放假情況,每年錄入系統(tǒng),這種如果客戶不怕麻煩的話。還是比較靠譜的;

本Demo將選擇第二種來實現(xiàn);

二、使用htmlunit在線解析網(wǎng)頁信息,獲取節(jié)假日情況

一開始是使用jsoup去解析網(wǎng)頁的,效果不理想,如果網(wǎng)頁是動態(tài)生成的時候,用jsoup遇到了各種問題,所以改成了htmlunit,總得來說htmlunit還是很強大的,能夠模擬瀏覽器運行,被譽為java瀏覽器的開源實現(xiàn);

首先去官網(wǎng)下載相關(guān)jar包,以及閱讀相關(guān)文檔:

http://htmlunit.sourceforge.net/

我這里解析的網(wǎng)頁是360的萬年歷:

http://hao.360.cn/rili/

日歷界面如下:

基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

被解析的 HTML格式如下:

基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

實現(xiàn)步驟:

1、加載頁面;

2、循環(huán)等待頁面加載完成(可能會有一些動態(tài)頁面,是用javascript生成);

3、根據(jù)網(wǎng)頁格式解析html內(nèi)容,并提取關(guān)鍵信息存入封裝好的對象;

注意點:

1、難點在于判斷是否休假及假期類型,由于原頁面并沒有標明每一天的假期類型,所以這里的邏輯要自己去實現(xiàn),詳情參考代碼;

2、之所以有個靜態(tài)latestVocationName變量,是防止出現(xiàn)以下情況(出現(xiàn)該情況的概率極低;PS:方法要每天調(diào)用一次,該變量才生效):

基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

代碼實現(xiàn):

定義一個中國日期類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package com.pichen.tools.getDate;
import java.util.Date;
public class ChinaDate {
/**
* 公歷時間
*/
private Date solarDate;
/**
* 農(nóng)歷日
*/
private String lunar;
/**
* 公歷日
*/
private String solar;
/**
* 是否是 休
*/
private boolean isVacation = false;
/**
* 如果是 休情況下的假期名字
*/
private String VacationName = "非假期";
/**
* 是否是 班
*/
private boolean isWorkFlag = false;
private boolean isSaturday = false;
private boolean isSunday = false;
/**
* @return the solarDate
*/
public Date getSolarDate() {
return solarDate;
}
/**
* @param solarDate the solarDate to set
*/
public void setSolarDate(Date solarDate) {
this.solarDate = solarDate;
}
/**
* @return the lunar
*/
public String getLunar() {
return lunar;
}
/**
* @param lunar the lunar to set
*/
public void setLunar(String lunar) {
this.lunar = lunar;
}
/**
* @return the solar
*/
public String getSolar() {
return solar;
}
/**
* @param solar the solar to 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 to set
*/
public void setVacationName(String vacationName) {
VacationName = vacationName;
}
/**
* @return the isWorkFlag
*/
public boolean isWorkFlag() {
return isWorkFlag;
}
/**
* @param isWorkFlag the isWorkFlag to set
*/
public void setWorkFlag(boolean isWorkFlag) {
this.isWorkFlag = isWorkFlag;
}
/**
* @return the isSaturday
*/
public boolean isSaturday() {
return isSaturday;
}
/**
* @param isSaturday the isSaturday to set
*/
public void setSaturday(boolean isSaturday) {
this.isSaturday = isSaturday;
}
/**
* @return the isSunday
*/
public boolean isSunday() {
return isSunday;
}
/**
* @param isSunday the isSunday to set
*/
public void setSunday(boolean isSunday) {
this.isSunday = isSunday;
}
}

解析網(wǎng)頁,并調(diào)用demo,打印本月詳情,和當天詳情:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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.List;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class Main {
private static String latestVocationName="";
public String getVocationName(DomNodeList<HtmlElement> htmlElements, String date) throws ParseException{
String rst = "";
boolean pastTimeFlag = false;
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date paramDate = dateFormat.parse(date);
if(new Date().getTime() >= paramDate.getTime()){
pastTimeFlag = true;
}
//first step //jugde if can get vocation name from html page
for(int i = 0; i < htmlElements.size(); i++){
HtmlElement element = htmlElements.get(i);
if(element.getAttribute("class").indexOf("vacation")!=-1){
boolean hitFlag = false;
String voationName = "";
for(; i < htmlElements.size(); i++){
HtmlElement elementTmp = htmlElements.get(i);
String liDate = elementTmp.getAttribute("date");
List<HtmlElement> lunar = elementTmp.getElementsByAttribute("span", "class", "lunar");
String lanarText = lunar.get(0).asText();
if(lanarText.equals("元旦")){
voationName = "元旦";
}else if(lanarText.equals("除夕")||lanarText.equals("春節(jié)")){
voationName = "春節(jié)";
}else if(lanarText.equals("清明")){
voationName = "清明";
}else if(lanarText.equals("國際勞動節(jié)")){
voationName = "國際勞動節(jié)";
}else if(lanarText.equals("端午節(jié)")){
voationName = "端午節(jié)";
}else if(lanarText.equals("中秋節(jié)")){
voationName = "中秋節(jié)";
}else if(lanarText.equals("國慶節(jié)")){
voationName = "國慶節(jié)";
}
if(liDate.equals(date)){
hitFlag = true;
}
if(elementTmp.getAttribute("class").indexOf("vacation")==-1){
break;
}
}
if(hitFlag == true && !voationName.equals("")){
rst = voationName;
break;
}
}else{
continue;
}
}
//if first step fail(rarely), get from the latest Vocation name
if(rst.equals("")){
System.out.println("warning: fail to get vocation name from html page.");
//you can judge by some simple rule
//from the latest Vocation name
rst = Main.latestVocationName;
}else if(pastTimeFlag == true){
//更新《當前時間,且最近一次的可見的假期名
Main.latestVocationName = rst;
}
return rst;
}
public List<ChinaDate> getCurrentDateInfo(){
WebClient webClient = null;
List<ChinaDate> dateList = null;
try{
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
dateList = new ArrayList<ChinaDate>();
webClient = new WebClient();
HtmlPage page = webClient.getPage("http://hao.360.cn/rili/");
//最大等待60秒
for(int k = 0; k < 60; k++){
if(!page.getElementById("M-dates").asText().equals("")) break;
Thread.sleep(1000);
}
//睡了8秒,等待頁面加載完成...,有時候,頁面可能獲取不到,不穩(wěn)定()
//Thread.sleep(8000);
DomNodeList<HtmlElement> htmlElements = page.getElementById("M-dates").getElementsByTagName("li");
//System.out.println(htmlElements.size());
for(HtmlElement 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("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")!=-1 &&
element.getAttribute("class").indexOf("last")==-1){
chinaDate.setSaturday(true);
}
if(element.getAttribute("class").indexOf("last weekend")!=-1){
chinaDate.setSunday(true);
}
if(element.getAttribute("class").indexOf("work")!=-1){
chinaDate.setWorkFlag(true);
}else if(chinaDate.isSaturday() == false &&
chinaDate.isSunday() == false &&
chinaDate.isVacation() == false ){
chinaDate.setWorkFlag(true);
}else{
chinaDate.setWorkFlag(false);
}
dateList.add(chinaDate);
}
}catch(Exception e){
e.printStackTrace();
System.out.println("get date from http://hao.360.cn/rili/ error~");
}finally{
webClient.close();
}
return dateList;
}
public ChinaDate getTodayInfo(){
List<ChinaDate> dateList = this.getCurrentDateInfo();
DateFormat 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) 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("本月詳情:");
for(ChinaDate date: dateList){
System.out.println(dateFormat.format(date.getSolarDate()) + " " + date.getVacationName());
}
System.out.println("------------------------------------------------------------------------");
System.out.println("今日詳情:");
System.out.println("日期:" + today.getSolarDate());
System.out.println("農(nóng)歷:"+today.getLunar());
System.out.println("公歷:"+today.getSolar());
System.out.println("假期名:"+today.getVacationName());
System.out.println("是否周六:"+today.isSaturday());
System.out.println("是否周日:"+today.isSunday());
System.out.println("是否休假:"+today.isVacation());
System.out.println("是否工作日:"+today.isWorkFlag());
System.out.println("已發(fā)生的最近一次假期:" + Main.latestVocationName);
}
}

運行程序,結(jié)果正確:

基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 海派甜心完整版在线观看 | 亚洲高清无码在线 视频 | 欧洲女同同性videos0 | 99精品视频在线观看re | 成人网免费视频 | 四虎永久在线精品国产 | 国产欧美日韩在线观看精品 | 国产免费小视频在线观看 | 天使萌痴汉在线中文字幕 | 亚洲精品乱码蜜桃久久久 | 国产成人高清精品免费5388密 | 亚洲AV国产国产久青草 | 亚洲99久久无色码中文字幕 | 亚洲成年男人的天堂网 | 国产在线拍 | 91精品国产麻豆国产自产在线 | 第一国内永久免费福利视频 | 女人全身裸露无遮挡免费观看 | 色婷婷综合久久久 | 高h短篇合集 | 特黄特级毛片免费视 | 糖心vlog麻豆精东影业传媒 | 扒开老师挠尿口到崩溃刑罚 | 国产aaaaa一级毛片 | 日本高清有码视频 | 精久久| 国产日日干 | 九九精品99久久久香蕉 | 欧美yyy| 欧美日韩一级视频 | 97国产蝌蚪视频在线观看 | 欧美精品一区二区三区久久 | 亚洲国产精品综合福利专区 | 亚洲免费网站在线观看 | 亚洲欧美自偷自拍另类小说 | 星空传媒在线视频 | 91尤物在线视频 | 国外欧美一区另类中文字幕 | 26uuu久久| 1024免费观看完整版在线播放 | 亚州中文字幕 |