欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记录:判断日期是工作日、休息日或法定休假日

程序员文章站 2022-05-16 22:27:15
...

RT:记录工作中客户提出的新需求,分辨日期是否是节假日与工作日,主要实现过程比较简单,通过爬虫获取百度日历数据接口,具体接口地址在下方代码中已经写明,调用接口判断日期即可,其中第一个参数为年份,第二个参数为固定值6018,具体实现代码如下:

package com.wly.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson.JSONArray;
import com.wly.entity.CalendayEntity;

public class CalendayUtil {
	
	// 百度api接口url地址
	private static String baiduApiUrl = "https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=%s&resource_id=%s";
	
	// 百度api查询resource_id字段值
	private static String resource_id = "6018";
	
	// 查询的年份
	private static int search_year = 0;
	
	// 保存节假日数据
	private static String festivalStr = null;
	
	// 用于保存上一次的日期,当日期更新后重新抓取百度日历接口数据
	private static String lastDate = null;
	
	// 将日期字符格式化为百度API传递的日期字符 如: 2017-10-01 --> 2017-10-1
	private SimpleDateFormat dFormat = new SimpleDateFormat("yyyy-MM-d");

	// 设置单例模式
	private static CalendayUtil calendayUtil = null;

	private CalendayUtil() { }

	public static CalendayUtil getInstance() {
		if (calendayUtil == null){
			calendayUtil = new CalendayUtil();
			// 首次创建对象时,保存当天日期
			lastDate = calendayUtil.dFormat.format(new Date());
		}
		// 当天时间与上次一查询时间不一至时,重新查询api数据
		if (!calendayUtil.dFormat.format(new Date()).equals(lastDate)){
			try {
				festivalStr = calendayUtil.sendReq(String.format(baiduApiUrl, search_year, resource_id));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return calendayUtil;
	}

	public String isFestival(Date date) throws IOException, ParseException {
		// 将日期字符格式化为百度API传递的日期字符 如: 2017-10-01 --> 2017-10-1
		return isFestival(dFormat.format(date));
	}

	public String isFestival(String dateStr) throws IOException, ParseException {
		Date dateParse = dFormat.parse(dateStr);
		// 获取当前查询日期的年份
		Calendar yearCalendar = Calendar.getInstance();
		yearCalendar.setTime(dateParse);
		// 未查询过数据
		if (search_year == 0){
			// 保存当前年份
			search_year = yearCalendar.getWeekYear();
			try {
				festivalStr = calendayUtil.sendReq(String.format(baiduApiUrl, search_year, resource_id));
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			// 查询过数据,如果年份不一样,则重新查询
			if (search_year != yearCalendar.getWeekYear()){
				search_year = yearCalendar.getWeekYear();
				try {
					festivalStr = calendayUtil.sendReq(String.format(baiduApiUrl, search_year, resource_id));
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		// 将日期字符格式化为百度API传递的日期字符 如: 2017-10-01 --> 2017-10-1
		dateStr = dFormat.format(dateParse);
		String festivalStatus = null;
		// 判断今天是否是工作日 周末 还是节假日
		JSONArray jsonArr = JsonUtil.getjsonArray(festivalStr, "data");
		String holiday = JsonUtil.getString(jsonArr.getString(0), "holiday");
		if (null != holiday){
			List<CalendayEntity> calendarEntities = JsonUtil.jsonToBeanList(holiday, CalendayEntity.class);
			// 循环判断指定日期是否包含在节假日中
			for (CalendayEntity calendar : calendarEntities) {
				if (dateStr.equals(calendar.festival)) {
					// 法定节假日
					festivalStatus = dateStr + "是" + calendar.name + ",为法定节假日";
					break;
				}
				for (CalendayEntity.Festival festival : calendar.list) {
					if (dateStr.equals(festival.date)) {
						if ("1".equals(festival.status)) {
							// 法定节假日
							festivalStatus = dateStr + "是法定节假日";
							break;
						} else {
							// 非法定节假日
							festivalStatus = dateStr + "为法定节假日调班,备注:" + calendar.desc;
							break;
						}
					}
				}
			}
		}
		// 当前日期不包含在法定节假日中
		if (festivalStatus == null) {
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
			Date parse = dateFormat.parse(dateStr);
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(parse);
			// 判断日期是否为周末
			if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
				festivalStatus = dateStr + "为周末,休息日";
			} else {
				festivalStatus = dateStr + "为工作日";
			}
		}
		return festivalStatus;
	}

	/**
	 * 发送请求获取百度日历节假日数据
	 * @param reqUrl
	 * @return
	 * @throws  
	 * @throws IOException
	 */
	public String sendReq(String reqUrl) throws IOException {
		// reqUrl = String.format(reqUrl, dateStr);
		StringBuilder result = new StringBuilder();
		URL url = new URL(reqUrl);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(10000);
		conn.setReadTimeout(10000);
		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		// 连接服务器
		conn.connect();
		try(BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "GBK"))){
			String line = null;
			while ((line = in.readLine()) != null) {
				result.append(line);
			}
		}
		return result.toString();
	}
	
}

以下是实体类:

package com.wly.entity;
import java.util.List;

public class CalendayEntity {
	// 节日
	public String festival;
	// 节日名称
	public String name;
	// 节假日列表,状态为1表示节假日,状态为2表示节假日前后调整工作日
	public List<Festival> list;
	// 节假日备注
	public String desc;
	
	public class Festival {
		// 日期,字符串格式如:"2017-10-01"
		public String date;
		// 假日状态
		public String status;
	}
}

测试代码如下:

package com.wly.test;

import java.io.IOException;
import java.text.ParseException;

import com.wly.util.CalendayUtil;

public class Main {
	public static void main(String[] args) {
		try {
			// 判断日期是否工作日
			for (int i = 1; i <= 31; i ++){
				System.out.println(CalendayUtil.getInstance().isFestival("2017-10-" + i));
			}
		} catch (IOException | ParseException e) {
			e.printStackTrace();
		}
	}
}

输出结果:

2017-10-1是国庆节,为法定节假日

2017-10-2是法定节假日

2017-10-3是法定节假日

2017-10-4是中秋节,为法定节假日

...

2017-10-31为工作日

转载于:https://my.oschina.net/u/3269106/blog/1581253