【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;
    }

}

 

 


版权声明:本文为Mr_EvanChen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>