의존성 추가
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>71.1</version>
</dependency>
코드 작성
1) CalendarType
public enum CalendarType {
SUN, MOON
}
2) Holiday
@Getter
public enum Holiday {
NEW_YEAR_DAY(CalendarType.SUN, 1, 1, false),
THREE_ONE_DAY(CalendarType.SUN, 3, 1, true),
CHILDREN_DAY(CalendarType.SUN, 5, 5, true),
MEMORIAL_DAY(CalendarType.SUN, 6, 6, false),
NATIONAL_LIBERATION_DAY(CalendarType.SUN, 8, 15, true),
NATIONAL_FOUNDATION_DAY(CalendarType.SUN, 10, 3, true),
HANGUL_DAY(CalendarType.SUN, 10, 9, true),
CHRISTMAS_DAY(CalendarType.SUN, 12, 25, false),
MOON_NEW_YEAR_DAY(CalendarType.MOON, 1, 1, true),
BUDDHA_COMING_DAY(CalendarType.MOON, 4, 8, false),
THANKSGIVING_DAY(CalendarType.MOON, 8, 15, true);
private CalendarType calendarType;
private int month;
private int day;
private boolean subHoliday;
Holiday(CalendarType calendarType, int month, int day, boolean subHoliday) {
this.calendarType = calendarType;
this.month = month;
this.day = day;
this.subHoliday = subHoliday;
}
public boolean isSunTypeCalendar() {
return this.calendarType == CalendarType.SUN;
}
}
3) HolidayChecker
public class HolidayChecker {
private List<LocalDate> getHolidayList() {
List<LocalDate> holidayList = new ArrayList<>();
int year = LocalDate.now().getYear();
Holiday[] holidays = Holiday.values();
for(Holiday holiday : holidays) {
if(holiday.isSunTypeCalendar()) {
LocalDate localDate = LocalDate.of(year, holiday.getMonth(), holiday.getDay());
holidayList.add(localDate);
LocalDate subHoliday = calculateSubHoliday(holiday, localDate);
if(subHoliday != null) holidayList.add(subHoliday);
} else {
if(holiday == Holiday.BUDDHA_COMING_DAY) {
LocalDate mainHoliday = transferToSunCalendarTypeDate(year, holiday);
holidayList.add(mainHoliday);
contiunue;
}
LocalDate mainHoliday = transferToSunCalendarTypeDate(year, holiday);
LocalDate plusOneMainHoliday = mainHoliday.plusDays(1);
LocalDate minusOneMainHoliday = mainHoliday.minusDays(1);
holidayList.add(mainHoliday);
holidayList.add(plusOneMainHoliday);
holidayList.add(minusOneMainHoliday);
LocalDate subHoliday = calcSubHoliday(mainHoliday, pluOneMainHoliday, minusOneMainHoliday);
if(subHoliday != null) holidayList.add(subHoliday);
}
}
return holidayList.stream().sorted().collect(Collectors.toList());
}
private LocalDate calculateSubHoliday(Holiday holiday, LocalDate localDate) {
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
int value = dayOfWeek.getValue();
if(holiday.isSubHoliday()) {
if(value == 6) return localDate.plusDays(2);
if(value == 7) return localDate.plusDays(1);
}
return null;
}
private LocalDate transferToSunCalendarTypeDate(int year, Holiday holiday) {
ChineseCalendar cc = new ChineseCalendar();
Calendar cal = Calcendar.getInstance();
cc.set(ChineseCalendar.EXTENDED_YEAR, year + 2637);
cc.set(ChineseCalendar.MONTH, holiday.getMonth() - 1);
cc.set(ChineseCalendar.DAY_OF_MONTH, holiday.getDay());
cal.setTimeInMillis(cc.getTimeInMillis());
return LocalDate.ofInstant(cal.toInstant(), ZoneId.systemDefault());
}
private LocalDate calcSubHoliday(LocalDate mainHoliday, LocalDate plusOneMainHoliday, LocalDate minusOneMainHoliday) {
if(minusOneMainHoliday.getDayOfWeek().getValue() == 7)
return minusOneMainHoliday.plusDays(3);
if(mainHoliday.getDayOfWeek().getValue == 7)
return mainHoliday.plusDays(2);
if(plusOneMainHoliday.getDayOfWeek().getValue() == 7)
return plusOneMainHoliday.plusDays(1);
return null;
}
}
사용
public boolean isPassDay() {
LocalDate now = LocalDate.now();
int value = now.getDayOfWeek().getValue();
if(value == 6) return true;
if(value == 7) return true;
HolidayChecker holidayChecker = new HolidayChecker();
List<LocalDate> holidayList = holidayChecker.getHolidayList();
return holidayList.contains(now);
}