记录一次计算两个日期间的工作日天数,排除节假日、周末等

it2024-03-14  84

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; }
最新回复(0)