한국 공휴일 구하기
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 |