본문 바로가기
JAVA/Java Study

[Java] 공휴일 구하기

by 늑인 2023. 11. 30.

icu4j-4.0.1.jar
5.39MB

한국 공휴일 구하기


public class HoliDayUtil {

    static final int LD_SUNDAY = 7;
    static final int LD_SATURDAY = 6;
    static final int LD_MONDAY = 1;

    public static void main(String[] args) {
        HoliDayUtil lc = new HoliDayUtil();
        System.out.println(lc.holidayArray("2024"));
        System.out.println(lc.isHoliday("20240128"));
        System.out.println(lc.isHoliday(new Date(2024, 0, 28)));
        System.out.println(lc.isHoliday(new Date()));
    }

    /**
     * 음력날짜를 양력날짜로 변환
     */
    private static String Lunar2Solar(String yyyymmdd) {
        ChineseCalendar cc = new ChineseCalendar();

        if (yyyymmdd == null)
            return null;

        String date = yyyymmdd.trim();
        if (date.length() != 8) {
            if (date.length() == 4)
                date = date + "0101";
            else if (date.length() == 6)
                date = date + "01";
            else if (date.length() > 8)
                date = date.substring(0, 8);
            else
                return null;
        }

        cc.set(ChineseCalendar.EXTENDED_YEAR, Integer.parseInt(date.substring(0, 4)) + 2637);   // 년, year + 2637
        cc.set(ChineseCalendar.MONTH, Integer.parseInt(date.substring(4, 6)) - 1);              // 월, month -1
        cc.set(ChineseCalendar.DAY_OF_MONTH, Integer.parseInt(date.substring(6)));              // 일

        LocalDate solar = Instant.ofEpochMilli(cc.getTimeInMillis()).atZone(ZoneId.of("UTC")).toLocalDate();

        int y = solar.getYear();
        int m = solar.getMonth().getValue();
        int d = solar.getDayOfMonth();

        StringBuilder ret = new StringBuilder();
        ret.append(String.format("%04d", y));
        ret.append(String.format("%02d", m));
        ret.append(String.format("%02d", d));

        return ret.toString();
    }


    public static boolean isHoliday(Date date){
        String yyyyMMdd = new java.text.SimpleDateFormat("yyyyMMdd").format(date);
        return isHoliday(yyyyMMdd);
    }

    public static boolean isHoliday(String yyyyMMdd){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        if(holidayArray(yyyyMMdd.substring(0,4)).contains(yyyyMMdd)) return true;
        else if(LocalDate.parse(yyyyMMdd, formatter).getDayOfWeek().getValue() == LD_SUNDAY) return true;
//        else if(LocalDate.parse(yyyyMMdd, formatter).getDayOfWeek().getValue() == LD_SATURDAY) return true;
        else return false;
    }

    public static Set<String> holidayArray(String yyyy) {
        Set<String> holidaysSet = new HashSet<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");

        // 양력 휴일
        holidaysSet.add(yyyy + "0101");   // 신정
        holidaysSet.add(yyyy + "0301");   // 삼일절
        holidaysSet.add(yyyy + "0505");   // 어린이날
        holidaysSet.add(yyyy + "0606");   // 현충일
        holidaysSet.add(yyyy + "0815");   // 광복절
        holidaysSet.add(yyyy + "1003");   // 개천절
        holidaysSet.add(yyyy + "1009");   // 한글날
        holidaysSet.add(yyyy + "1002");   // 한글날
        holidaysSet.add(yyyy + "1225");   // 성탄절

        // 음력 휴일

        String prev_seol = LocalDate.parse(Lunar2Solar(yyyy + "0101"), formatter).minusDays(1).toString().replace("-", "");
        holidaysSet.add(yyyy + prev_seol.substring(4));        // ""
        holidaysSet.add(yyyy + SolarDays(yyyy, "0101"));  // 설날
        holidaysSet.add(yyyy + SolarDays(yyyy, "0102"));  // ""
        holidaysSet.add(yyyy + SolarDays(yyyy, "0408"));  // 석탄일
        holidaysSet.add(yyyy + SolarDays(yyyy, "0814"));  // ""
        holidaysSet.add(yyyy + SolarDays(yyyy, "0815"));  // 추석
        holidaysSet.add(yyyy + SolarDays(yyyy, "0816"));  // ""


        try {
            // 어린이날 대체공휴일 검사 : 어린이날은 토요일, 일요일인 경우 그 다음 평일을 대체공유일로 지정

            int childDayChk = LocalDate.parse(yyyy + "0505", formatter).getDayOfWeek().getValue();
            if (childDayChk == LD_SUNDAY) {      // 일요일
                holidaysSet.add(yyyy + "0506");
            }
            if (childDayChk == LD_SATURDAY) {  // 토요일
                holidaysSet.add(yyyy + "0507");
            }

            // 설날 대체공휴일 검사
            if (LocalDate.parse(Lunar2Solar(yyyy + "0101"), formatter).getDayOfWeek().getValue() == LD_SUNDAY) {    // 일
                holidaysSet.add(Lunar2Solar(yyyy + "0103"));
            }
            if (LocalDate.parse(Lunar2Solar(yyyy + "0101"), formatter).getDayOfWeek().getValue() == LD_MONDAY) {    // 월
                holidaysSet.add(Lunar2Solar(yyyy + "0103"));
            }
            if (LocalDate.parse(Lunar2Solar(yyyy + "0102"), formatter).getDayOfWeek().getValue() == LD_SUNDAY) {    // 일
                holidaysSet.add(Lunar2Solar(yyyy + "0103"));
            }

            // 추석 대체공휴일 검사
            if (LocalDate.parse(Lunar2Solar(yyyy + "0814"), formatter).getDayOfWeek().getValue() == LD_SUNDAY) {
                holidaysSet.add(Lunar2Solar(yyyy + "0817"));
            }
            if (LocalDate.parse(Lunar2Solar(yyyy + "0815"), formatter).getDayOfWeek().getValue() == LD_SUNDAY) {
                holidaysSet.add(Lunar2Solar(yyyy + "0817"));
            }
            if (LocalDate.parse(Lunar2Solar(yyyy + "0816"), formatter).getDayOfWeek().getValue() == LD_SUNDAY) {
                holidaysSet.add(Lunar2Solar(yyyy + "0817"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return holidaysSet;
    }

    private static String SolarDays(String yyyy, String date) {
        return Lunar2Solar(yyyy + date).substring(4);
    }
}

'JAVA > Java Study' 카테고리의 다른 글

[Java] Java 한글 라이브러리 hwpxlib  (0) 2023.12.18
[Java] Calandar 활용  (0) 2023.11.30
[Java] Oracle 타입별 매핑표  (1) 2023.11.28
[Java] portable 버전 만들어보기  (0) 2023.10.24
[Java] 크롤링과 API 차이  (0) 2023.10.23