백엔드(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;
}
반복문을 돌면서 하루씩 늘려주면서 반복문을 도는게 핵심이다. 간단!
반응형