java日期工具类-获取两个日期之间的工作日天数(只去除周六日)

获取两个日期之间的工作日天数 (只去除周六日,未去除节假日)

其他参考资料:

两个日期之间的工作日计算工具类https://www.cnblogs.com/zzlp/p/5166605.htmlhttps://blog.csdn.net/weixin_30731305/article/details/99756422

方法1、使用循环的方式遍历两个日期的每一天,当日期不属于周六日时, 工作日 + 1

方法2、

1、如果两个时间在同一周,且都不是周末日期,直接返回 时间差,提高执行效率

2、不是同一周时,将开始日期和结束日期都设置到下个周一,计算这两个周一之间的工作日天数。

  计算开始日期到下周一,结束日期到下周一的偏移天数。 获取到两个偏移天数的差值。

总的工作日天数 = 将获取到的工作日天数 + 偏移天数差值

日期工具类

DateUtils.java

public class DateUtils {    /**     * 获取两个时间之内的工作日时间(只去掉两个日期之间的周末时间,法定节假日未去掉) 时间精确到日     *     * @param startDate     *            -起始时间     * @param endDate     *            -结束时间     * @return Long型时间差对象     */    public static int getWorkdayTimeInDate(Date startDate, Date endDate) {        long start = startDate.getTime();        long end = endDate.getTime();        // 如果起始时间大于结束时间,将二者交换        if (start > end) {            long temp = start;            start = end;            end = temp;        }        // 根据参数获取起始时间与结束时间的日历类型对象        Calendar sdate = Calendar.getInstance();        Calendar edate = Calendar.getInstance();        sdate.setTimeInMillis(start);        edate.setTimeInMillis(end);        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        try {            sdate.setTime(sdf.parse(sdf.format(sdate.getTime())));            edate.setTime(sdf.parse(sdf.format(edate.getTime())));        } catch (ParseException e) {            e.printStackTrace();        }        // 如果两个时间在同一周并且都不是周末日期,则直接返回时间差,增加执行效率        if (sdate.get(Calendar.YEAR) == edate.get(Calendar.YEAR)            && sdate.get(Calendar.WEEK_OF_YEAR) == edate.get(Calendar.WEEK_OF_YEAR)            && sdate.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY            && sdate.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY            && edate.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY            && edate.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {            long between_days = (end - start) / (1000 * 3600 * 24);            return Integer.parseInt(String.valueOf(between_days));        }        // 防止开始日期在周五,结束日期在周日情况下,计算间隔天数不准确问题,开始或结束日期为周六日时,        // 开始日期周六日,设置为下周一。        if (sdate.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {            sdate.add(Calendar.DAY_OF_MONTH, 1);        }        if (sdate.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {            // 开始日期在周六日时,设置日期为周一            sdate.add(Calendar.DAY_OF_MONTH, 2);        }        start = sdate.getTimeInMillis();        // 结束日期为周六日时,设置为周五        if (edate.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {            edate.add(Calendar.DAY_OF_MONTH, -2);        }        if (edate.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {            edate.add(Calendar.DAY_OF_MONTH, -1);        }        end = edate.getTimeInMillis();        // 首先取得起始日期与结束日期的下个周一的日期        Calendar snextM = getNextMonday(sdate);        Calendar enextM = getNextMonday(edate);        // 获取这两个周一之间的实际天数        int days = 0;        try {            days = daysBetween(snextM.getTime(), enextM.getTime());        } catch (ParseException e) {            e.printStackTrace();        }        // 获取这两个周一之间的工作日数(两个周一之间的天数肯定能被7整除,并且工作日数量占其中的5/7)        int workdays = days / 7 * 5;        // 获取开始时间的偏移量        long scharge = 0;        sdate.setTimeInMillis(start);        edate.setTimeInMillis(end);        if (sdate.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY            && sdate.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {            // 只有在开始时间为非周末的时候才计算偏移量            scharge += (7 - sdate.get(Calendar.DAY_OF_WEEK)) * 24 * 3600000;            scharge -= sdate.get(Calendar.HOUR_OF_DAY) * 3600000;            scharge -= sdate.get(Calendar.MINUTE) * 60000;            scharge -= sdate.get(Calendar.SECOND) * 1000;            scharge -= sdate.get(Calendar.MILLISECOND);        }        // 获取结束时间的偏移量        long echarge = 0;        if (edate.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY            && edate.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {            // 只有在结束时间为非周末的时候才计算偏移量            echarge += (7 - edate.get(Calendar.DAY_OF_WEEK)) * 24 * 3600000;            echarge -= edate.get(Calendar.HOUR_OF_DAY) * 3600000;            echarge -= edate.get(Calendar.MINUTE) * 60000;            echarge -= edate.get(Calendar.SECOND) * 1000;            echarge -= edate.get(Calendar.MILLISECOND);        }        // 计算最终结果,具体为:workdays加上开始时间的时间偏移量,减去结束时间的时间偏移量        long between_days = workdays + (scharge - echarge) / (1000 * 3600 * 24);        return Integer.parseInt(String.valueOf(between_days));    }    /**     * 获取下周一     *     * @param calendar     *            指定日期     * @return     */    private static Calendar getNextMonday(Calendar calendar) {        int addnum = 9 - calendar.get(Calendar.DAY_OF_WEEK);        if (addnum == 8) {            addnum = 1;// 周日的情况        }        calendar.add(Calendar.DATE, addnum);        return calendar;    }    /**     *     * 计算两个日期之间相差的天数     *     * @param smdate     *            较小的时间     *     * @param bdate     *            较大的时间     *     * @return 相差天数     *     * @throws ParseException     *     */    public static int daysBetween(Date smdate, Date bdate) throws ParseException {        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");        smdate = sdf.parse(sdf.format(smdate));        bdate = sdf.parse(sdf.format(bdate));        Calendar cal = Calendar.getInstance();        cal.setTime(smdate);        long time1 = cal.getTimeInMillis();        cal.setTime(bdate);        long time2 = cal.getTimeInMillis();        long between_days = (time2 - time1) / (1000 * 3600 * 24);        return Integer.parseInt(String.valueOf(between_days));    }}
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章