阅读背景:

【Java】判断是否是工作日、计算工期(去除周末)

来源:互联网 

这里主要是通过java util包中的Calendar,来判断是否是工作日、计算工期(去除周末)

/** * @ Author:yl1794 * @ Date:2019/10/14 16:03 * @ Description: */ public class DateCountUtil { public static final long milliOfDay = 86400 * 1000; /** * 递归:计算开始时间 * 防止因期望开始时间在非工作日,而经过逆推导致最终开始时间在参考时间之前的问题 * * 该场景主要是用于有任务与前置任务的关系。假设A是B的前置任务,则B的开始时间必须在A的截止时间之后。 * 若A的截止时间为星期六(referenceTime),那么B的期望开始时间为星期日,由于不是工作日则会往前推,一直推到星期五。 * 该时间不满足前提,B的正确开始时间应该是下周一。 * * @param startTime 期望开始时间 * @param referenceTime 参考时间 * @return 正确开始时间 */ public static long calculationStartTime(long startTime, long referenceTime){ long startTimeNew = DateCountUtil.countTime(startTime, true); // 期望开始时间必须在参考时间之后 if(startTimeNew > referenceTime){ return startTimeNew; } return calculationStartTime(startTime + DateCountUtil.milliOfDay, referenceTime); } /** * 根据开始时间和工期计算截止时间(扣除周末) * * @param startTime 开始时间 * @param period 工期 * @return 截止时间 */ public static long calculationEndTime(long startTime, int period) { JDateTime endTime = new JDateTime(startTime).addDay(1).subMillisecond(1); // 遍历工期,判断每天是否是周末 for (int i = period - 1; i > 0; i--) { endTime = endTime.addDay(1); int dayOfWeek = endTime.getDayOfWeek(); // 如果是周末,则直接跳到周一 if (dayOfWeek > 5) { endTime = endTime.addDay(7 - dayOfWeek + 1); } } return endTime.getTimeInMillis(); } /** * 计算工期(扣除周末) * * @param startTime 开始时间 * @param endTime 截止时间 * @return 工期 */ public static int countPeriod(long startTime, long endTime) { int numberOfDays = 0; Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTimeInMillis(startTime); cal2.setTimeInMillis(setEndOfDay(endTime)); while (cal1.before(cal2)) { if ((Calendar.SATURDAY != cal1.get(Calendar.DAY_OF_WEEK)) && (Calendar.SUNDAY != cal1.get(Calendar.DAY_OF_WEEK))) { numberOfDays++; } cal1.add(Calendar.DATE, 1); } return numberOfDays; } /** * 计算时间。若是开始时间,则往前计算直至工作日;反之,往后计算。 * * @param nowTime 时间 * @param isStartTime 是否是开始时间 * @return 时间 */ private static long countTime(long nowTime, boolean isStartTime) { while (!isWeekday(nowTime)) { nowTime = isStartTime ? nowTime - milliOfDay : nowTime + milliOfDay; } return nowTime; } /** * 校验某天是否是工作日 * * @param date 日期 * @return true / false */ private static Boolean isWeekday(long date) { if (isEmpty(date)) { return false; } Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(date); return cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY; } /** * 将开始时间设置为该天的最开始 * * @param startTime 日期 * @return 开始时间 */ public static long setStartOfDay(long startTime) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(startTime); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); // 注意毫秒的影响 return cal.getTimeInMillis(); } /** * 将截止时间设置为该天的最晚 * * @param endTime 日期 * @return 截止时间 */ public static long setEndOfDay(long endTime) { return setStartOfDay(endTime) + milliOfDay - 1; } } /



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: