1.数据库存储节假日、补班日期
数据库结构如下,0代表节日,1代表补班日期,需要每年更新
2.代码
(1)计算相差天数
@Override
public Long getWorkDay(String startDate, String endDate) {
try {
//获取所有节假日
List<String> holidayList = dateDao.getMnHoliday(0L);
//获取补班日期
List<String> workdayList = dateDao.getMnHoliday(1L);
List<Calendar> holiday = initHolidayList(holidayList);
List<Calendar> workday = initHolidayList(workdayList);
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar ca = Calendar.getInstance();
Date sd = df.parse(startDate);
Date ed = df.parse(endDate);
Long heaven = 0L;
ca.setTime(sd);
while (sd.compareTo(ed) == -1) {
if (!checkHoliday(ca, holiday, workday)) {
heaven++;
}
ca.add(Calendar.DAY_OF_MONTH,1);
sd=ca.getTime();
}
return heaven;
} catch (Exception e) {
e.printStackTrace();
}
return 0L;
}
(2)初始化日期
/**
* 初始化日期
* @param date
* @return
*/
public List<Calendar> initHolidayList(List<String> date) {
List<Calendar> list = new ArrayList<Calendar>();
for (String string : date) {
String[] da = string.split("-");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, Integer.valueOf(da[0]));
calendar.set(Calendar.MONTH, Integer.valueOf(da[1]) - 1);// 月份比正常小1,0代表一月
calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(da[2]));
list.add(calendar);
}
return list;
}
(3)判断是否是休息日
/**
* 判断日期时候是休息日
* @param calendar 传入日期
* @param holiday 所有节假日
* @param workday 所有工作日
* @return
* @throws Exception
*/
public static boolean checkHoliday(Calendar calendar, List<Calendar> holiday, List<Calendar> workday) throws Exception {
//判断日期是否是补班日期
for (Calendar ca : workday) {
if (ca.get(Calendar.MONTH) == calendar.get(Calendar.MONTH) &&
ca.get(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH) &&
ca.get(Calendar.YEAR) == calendar.get(Calendar.YEAR)) {
return false;
}
}
//判断日期是否是周六周日
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY ||
calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
return true;
}
//判断日期是否是节假日
for (Calendar ca : holiday) {
if (ca.get(Calendar.MONTH) == calendar.get(Calendar.MONTH) &&
ca.get(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH) &&
ca.get(Calendar.YEAR) == calendar.get(Calendar.YEAR)) {
return true;
}
}
return false;
}