Java计算两个日期之间的工作日天数, 即除星期六日和自定义上班日期和放假日期

老金 老金 2022.2.25 18:49 浏览(1073) 评论 (0)

计算时间区间内的工作日天数,很明显正常情况下,周一到周五工作,周六周日休息,但是在这其中有些日子需要被特殊对待,比如法定节假日,或者一些因为节假日被调休的周末需要工作,再或者根据公司单位的要求不同 设定特殊的工作或休息日。

import org.apache.commons.lang3.time.DateFormatUtils;
    import java.text.SimpleDateFormat;
    import java.util.*;
    /**
     * 计算工作日util
     * 计算工作日util
     *
     * @Author Evan
     * @Date 2020/3/24 13:53
     **/
    import java.text.ParseException;
    import java.util.Calendar;
    public class CalculateWorkDaysUtil {
        /*
          特殊的工作日(星期六、日工作)
                  */
        private static final List<String> SPECIAL_WORK_DAYS = new ArrayList<>();
        /*   特殊的休息日(星期一到五休息)
         */
        private static final List<String> SPECIAL_REST_DAYS = new ArrayList<>();
        static {
            initSpecialDays();
        }
        private static void initSpecialDays() {
            //手动维护特殊放假或工作的日子
            SPECIAL_WORK_DAYS.add("2020-10-10");
            SPECIAL_REST_DAYS.add("2020-10-01");
            SPECIAL_REST_DAYS.add("2020-10-02");
            SPECIAL_REST_DAYS.add("2020-10-05");
            SPECIAL_REST_DAYS.add("2020-10-06");
            SPECIAL_REST_DAYS.add("2020-10-07");
            SPECIAL_REST_DAYS.add("2020-10-08");
        }
        public static int getworkDays(String strStartDate, String strEndDate) {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            Calendar cl1 = Calendar.getInstance();
            Calendar cl2 = Calendar.getInstance();
            try {
                cl1.setTime(df.parse(strStartDate));
                cl2.setTime(df.parse(strEndDate));
            } catch (ParseException e) {
                System.out.println("日期格式非法");
                e.printStackTrace();
            }
            int count = 0;
            while (cl1.compareTo(cl2) <= 0) {
                //如果不是周六或者周日则工作日+1
                if (cl1.get(Calendar.DAY_OF_WEEK) != 7 && cl1.get(Calendar.DAY_OF_WEEK) != 1) {
                    count++;
                    //如果不是周六或者周日,但是该日属于国家法定节假日或者特殊放假日则-1
                    if (SPECIAL_REST_DAYS.contains(DateFormatUtils.format(cl1.getTime(), "yyyy-MM-dd"))) {
                        count--;
                    }
                }
                //如果是周六或者周日,但是该日属于需要工作的日子则 +1
                if (SPECIAL_WORK_DAYS.contains(DateFormatUtils.format(cl1.getTime(), "yyyy-MM-dd"))) {
                    count++;
                }
                cl1.add(Calendar.DAY_OF_MONTH, 1);
            }
            return count;
        }
     public static void main(String[] args) {
            System.out.println(
            getworkDays("2020-09-27", "2020-10-11")
            );
        }
    }
    

 

结果为 4

本文链接 https://www.mangoxo.com/blog/ro4Y2zxj 版权所有,转载请保留地址链接,感谢!

老金 关注
善良的程序宅
  • 93 动态
  • 0 相册
  • 3 粉丝
  • 11 获赞