인생은 속도가 아니라 방향이다

[Java] 두 날짜 사이에 주말 제외한 평일 일수 구하기 본문

백엔드(Back-end)/Java

[Java] 두 날짜 사이에 주말 제외한 평일 일수 구하기

기록하는 동구 2022. 1. 22. 08:28
반응형

회사에서 해당 기간동안의 근무해야하는 날짜를 알려주는 봇을 만들어보고싶었다.

 

허점이 있다면 평일에있는 휴일들을 걸러내고 싶어서 다른 라이브러리를 참고했어야지만,,,, 쩝  걍 빠르게 하드코딩하는게 나아보였다. 그래서 주말은 Calendar를 통해서 걸러내고 평일 휴일들은 하드코딩으로 걸러낸다. 

 

 

결과는 메시지는 이렇게 보이게 만들것이다 

 

일할 일수 17일 | 쉬는 일 수(주말포함) 10일 | 평일 휴일 [2022-02-01 , 2022-02-02]

 

 

아래는 결과를 담을 DTO 이다. 참고 

@Getter
@ToString
@Builder
public class WorkingDayDTO {

    private int workingDays;

    private int notWorkingDays;

    private List holidayList;

    @Override
    public String toString() {

        String strList = holidayList.stream()
                .collect(Collectors.joining(" , ", "[", "]")).toString();
        return "일할 일수 " + workingDays + "일 | 쉬는 일 수(주말포함) " + notWorkingDays + "일 | 평일 휴일 " + strList;
    }
}

 

 

실제 특정 기간안에 주말, 휴일 을 제외하고 일하는 날짜를 가져오는 코드는 다음과 같다. 

public static WorkingDayDTO getWorkingDays(String starDate, String endDate) {

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    Date dateStartDate = null;
    Date dateEndDate = null;
    try {

        dateStartDate = df.parse(starDate);
        dateEndDate = df.parse(endDate);

    } catch (ParseException parseException) {
        System.out.println(parseException.getStackTrace());
    }

    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(dateStartDate);
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(dateEndDate);
    int workingdays = 0;
    int notWorkingdays = 0;

    // 평일 휴일 리스트
    String month = starDate.substring(5, 7);
    List holidayList = getHolidayList(month);

    while (cal1.before(cal2)) {
        if (Calendar.SATURDAY != cal1.get(Calendar.DAY_OF_WEEK) && (Calendar.SUNDAY != cal1.get(Calendar.DAY_OF_WEEK) && !holidayList.contains(starDate))
        ) {
            workingdays++;
        } else {
            notWorkingdays++;
        }
        cal1.add(Calendar.DATE, 1);
        starDate = df.format(cal1.getTime());
    }
    System.out.println("workingdays : " + workingdays);
    System.out.println("notWorkingdays : " + notWorkingdays);


    WorkingDayDTO workingDayDTO = WorkingDayDTO.builder()
            .workingDays(workingdays)
            .notWorkingDays(notWorkingdays)
            .holidayList(holidayList)
            .build();


    return workingDayDTO;

}

 

반복문을 돌면서 하루씩 늘려주면서 반복문을 도는게 핵심이다. 간단!

반응형
Comments