注:数据需要手动维护,每年维护一次,当年12月份国家会公布第二年法定节假日 日期及天数
1.表结构
CREATE TABLE `sys_calendar` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`days` varchar(200) DEFAULT NULL COMMENT '日期',
`workmarkers` varchar(255) DEFAULT NULL COMMENT '是否工作日',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1462 DEFAULT CHARSET=utf8mb4 COMMENT='自定义日历表(区分工作日)';
2.计算代码
public class DateOper {
private String holidays;//放假日
private String workdays;//工作日
public DateOper() {
String sqlholiday = "select days from sys_calendar where workmarkers='N'";// 这不是工作日查询
String sqlworkday = "select days from sys_calendar where workmarkers='Y'";//工作日查询
// 得到今年和明年的所有的假日
ArrayList<HashMap<String, String>> holidayList = DBoper.QueryData(sqlholiday);
if(holidayList!=null && holidayList.size()>0)
{
for(int i=0;i<holidayList.size();i++)
{
Map row = holidayList.get(i);
holidays += row.get("days").toString() + ",";
}
}
System.out.println(holidays);
// 得到今年和明年的所有的假日
ArrayList<HashMap<String, String>> workdayList = DBoper.QueryData(sqlworkday);
if(workdayList!=null && workdayList.size()>=0)
{
for(int i=0;i<workdayList.size();i++)
{
Map row = workdayList.get(i);
workdays += row.get("days").toString() + ",";
}
}
System.out.println(workdays);
}
public int countWorkDay(String start1, String end1) {
String strsql;
// 工作日
int workDay = 0;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start=null;
Date end = null;
try {
start=(Date) sdf.parse(start1);
end = (Date) sdf.parse(end1);
} catch (ParseException e) {
System.out.println("非法的日期格式,无法进行转换");
e.printStackTrace();
}
//int thisyear = start.getYear() + 1900;
//int nextyear = thisyear == end.getYear() ? thisyear + 1 : end.getYear() + 1900;
System.out.println("start>>"+start+" end>>"+end);
int days = getDutyDays(start, end);
System.out.println("start>>"+start1+" end>>"+end1+" days>>"+days);
return days;
}
public int getDutyDays(Date StartDate,Date EndDate) {//得到非周六周日的工作日
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
StartDate.setDate(StartDate.getDate() + 1);
int result = 0;
while (StartDate.compareTo(EndDate) <= 0) {
if (StartDate.getDay() != 6 && StartDate.getDay() != 0)//周内
{
result++;
// System.out.println(holidays);
if(!holidays.isEmpty())
{
if(holidays.indexOf(sdf.format(StartDate))>-1)//不是节假日加1
result--;
}
}
else //周末
{ if(!workdays.isEmpty())
{
if(workdays.indexOf(sdf.format(StartDate))>-1)//工作日
result++;
}
}
// System.out.println(StartDate+"-------"+StartDate.getDay()+"-----"+result+"******"+holidays.indexOf(sdf.format(StartDate))+"******"+workdays.indexOf(sdf.format(StartDate)));
StartDate.setDate(StartDate.getDate() + 1);
}
return result;
}
}
3.调用代码()