1. package com.seanwang.test;
    2. import java.text.DateFormat;
    3. import java.text.ParseException;
    4. import java.text.SimpleDateFormat;
    5. import java.util.*;
    6. /**
    7. * @author seanwang
    8. * @date 2021/8/16 0016 下午 10:51
    9. */
    10. /*
    11. * 思路:
    12. * 法定日期每年都不定,没法计算,所以需要有一张表去维护那些日期是法定工作日和法定节假日的日期。周末可以通过日历类判断
    13. * 借助Calendar日历类获取两个日期之间的所有日期,从前往后挨个日期进行判断:
    14. * --如果是周末 判断是不是法定工作日,如果是则天数加一;
    15. * --如果不是周末 判断是不是法定节假日,如果不是则天数加一;
    16. * 最后得到的累加天数就是两个日期之间的工作日天数。
    17. * */
    18. /**
    19. * 计算任意2个日期内的工作日天数,也可以得到中间所有的工作日日期(考虑法定节假日、法定工作日、周末)
    20. * @author user
    21. *
    22. */
    23. public class DateCal {
    24. /**
    25. * @param args
    26. */
    27. public static void main(String[] args) {
    28. try {
    29. //1.初始化法定节假日和法定工作日
    30. ArrayList<Holidays> holidays = new ArrayList<>();
    31. //法定节假日 status:1--法定工作日 2--法定节假日
    32. holidays.add(new Holidays("2021-10-01", "2"));
    33. holidays.add(new Holidays("2021-10-02", "2"));
    34. holidays.add(new Holidays("2021-10-03", "2"));
    35. holidays.add(new Holidays("2021-10-04", "2"));
    36. holidays.add(new Holidays("2021-10-05", "2"));
    37. holidays.add(new Holidays("2021-10-06", "2"));
    38. holidays.add(new Holidays("2021-10-07", "2"));
    39. //本该周末的法定上班日
    40. holidays.add(new Holidays("2021-10-08", "1"));
    41. holidays.add(new Holidays("2021-10-09", "1"));
    42. ArrayList<String> workDays = new ArrayList<>();
    43. ArrayList<String> holiyDays = new ArrayList<>();
    44. for (Holidays holiday : holidays) {
    45. if ("1".equals(holiday.getStatus())) {
    46. workDays.add(holiday.getDay());
    47. }else {
    48. holiyDays.add(holiday.getDay());
    49. }
    50. }
    51. //2.计算两个日期之间的所有日期,排除法定节假日,并添加本该周末的法定上班日
    52. Calendar cal = Calendar.getInstance();
    53. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    54. List<String> days = getDays("2021-10-11", "2021-10-12");
    55. int workDayCount = 0;
    56. for (String day : days) {
    57. Date parse = sdf.parse(day);
    58. cal.setTime(parse);
    59. /*
    60. Calendar.DAY_OF_WEEK的值对应的星期
    61. 日 一 二 三 四 五 六
    62. 1 2 3 4 5 6 7
    63. */
    64. //日历中的周末,如果为法定工作日,则天数 +1
    65. if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
    66. if (workDays.contains(day)) {
    67. workDayCount++;
    68. }
    69. //日历中的工作日,如果不是法定节假日,则天数 +1
    70. }else {
    71. if (!holiyDays.contains(day)) {
    72. workDayCount++;
    73. }
    74. }
    75. }
    76. System.out.println("2021-10-01---2021-10-31"+" 需要上班天数:"+workDayCount);
    77. } catch (Exception e) {
    78. // TODO: handle exception
    79. }
    80. }
    81. public static List<String> getDays(String startTime, String endTime) {
    82. // 返回的日期集合
    83. List<String> days = new ArrayList<String>();
    84. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    85. try {
    86. Date start = dateFormat.parse(startTime);
    87. Date end = dateFormat.parse(endTime);
    88. Calendar tempStart = Calendar.getInstance();
    89. tempStart.setTime(start);
    90. Calendar tempEnd = Calendar.getInstance();
    91. tempEnd.setTime(end);
    92. // 日期加1(包含结束)
    93. tempEnd.add(Calendar.DATE, +1);
    94. while (tempStart.before(tempEnd)) {
    95. days.add(dateFormat.format(tempStart.getTime()));
    96. tempStart.add(Calendar.DAY_OF_YEAR, 1);
    97. }
    98. } catch (ParseException e) {
    99. e.printStackTrace();
    100. }
    101. return days;
    102. }
    103. }
    104. class Holidays {
    105. String day;
    106. String status;
    107. @Override
    108. public String toString() {
    109. return "Holidays{" +
    110. "day='" + day + '\'' +
    111. ", status='" + status + '\'' +
    112. '}';
    113. }
    114. public Holidays(String day, String status) {
    115. this.day = day;
    116. this.status = status;
    117. }
    118. public String getDay() {
    119. return day;
    120. }
    121. public void setDay(String day) {
    122. this.day = day;
    123. }
    124. public String getStatus() {
    125. return status;
    126. }
    127. public void setStatus(String status) {
    128. this.status = status;
    129. }
    130. }