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

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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值