9cba09d646
- 2028~2030 음력 공휴일: 설날/부처님오신날/추석 연휴 - 대체공휴일: 2028-10-05(추석·개천절 겹침), 2029-05-07(어린이날 토), 2029-05-21(부처님오신날 일), 2029-09-24(추석 연휴 일), 2030-02-05(설날 연휴 일), 2030-05-06(어린이날 일) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
127 lines
4.9 KiB
Python
127 lines
4.9 KiB
Python
"""대한민국 공휴일 판정 + 이름 (달력 색상·표기용).
|
|
|
|
- 고정 양력 공휴일은 매년 동일 → 연도 무관 판정.
|
|
- 음력 공휴일(설날/부처님오신날/추석)과 대체공휴일은 매년 달라짐 →
|
|
연도별 dict(`_LUNAR_AND_SUBSTITUTE`)에 명시. 새 연도는 KASI 발표값을 추가한다.
|
|
- 대체공휴일은 원래 공휴일 이름 대신 "대체공휴일"로 표기한다.
|
|
|
|
수록 연도: 2025 ~ 2030. 미수록 연도는 고정 양력 공휴일만 빨강 처리된다(음력/대체는 누락).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import date
|
|
|
|
SUBSTITUTE = "대체공휴일"
|
|
|
|
# 매년 동일한 양력 공휴일 (month, day) -> 이름
|
|
_FIXED_SOLAR: dict[tuple[int, int], str] = {
|
|
(1, 1): "신정",
|
|
(3, 1): "삼일절",
|
|
(5, 5): "어린이날",
|
|
(6, 6): "현충일",
|
|
(7, 17): "제헌절", # 2026년부터 공휴일. 대체공휴일 대상 아님(토·일과 겹쳐도 대체 없음)
|
|
(8, 15): "광복절",
|
|
(10, 3): "개천절",
|
|
(10, 9): "한글날",
|
|
(12, 25): "성탄절",
|
|
}
|
|
|
|
# 대체공휴일 대상: 삼일절·어린이날·광복절·개천절·한글날·설날·추석·부처님오신날·성탄절
|
|
# (신정·현충일·제헌절은 대상이 아니다.)
|
|
# 연도별 음력 공휴일 + 대체공휴일 (ISO 날짜 -> 이름). KASI 발표 기준.
|
|
_LUNAR_AND_SUBSTITUTE: dict[int, dict[str, str]] = {
|
|
2025: {
|
|
"2025-01-28": "설날 연휴",
|
|
"2025-01-29": "설날",
|
|
"2025-01-30": "설날 연휴",
|
|
"2025-03-03": SUBSTITUTE, # 삼일절(3/1 토)
|
|
"2025-05-05": "부처님오신날", # 어린이날과 같은 날
|
|
"2025-05-06": SUBSTITUTE, # 부처님오신날 겹침
|
|
"2025-10-06": "추석",
|
|
"2025-10-07": "추석 연휴",
|
|
"2025-10-08": SUBSTITUTE, # 추석 연휴 겹침
|
|
},
|
|
2026: {
|
|
"2026-02-16": "설날 연휴",
|
|
"2026-02-17": "설날",
|
|
"2026-02-18": "설날 연휴",
|
|
"2026-03-02": SUBSTITUTE, # 삼일절(3/1 일)
|
|
"2026-05-24": "부처님오신날",
|
|
"2026-05-25": SUBSTITUTE,
|
|
"2026-08-17": SUBSTITUTE, # 광복절(8/15 토)
|
|
"2026-09-24": "추석 연휴",
|
|
"2026-09-25": "추석",
|
|
"2026-09-26": "추석 연휴",
|
|
"2026-09-28": SUBSTITUTE,
|
|
"2026-10-05": SUBSTITUTE, # 개천절(10/3 토)
|
|
},
|
|
2027: {
|
|
"2027-02-06": "설날 연휴",
|
|
"2027-02-07": "설날",
|
|
"2027-02-08": "설날 연휴",
|
|
"2027-02-09": SUBSTITUTE,
|
|
"2027-05-13": "부처님오신날",
|
|
"2027-08-16": SUBSTITUTE, # 광복절(8/15 일)
|
|
"2027-09-14": "추석 연휴",
|
|
"2027-09-15": "추석",
|
|
"2027-09-16": "추석 연휴",
|
|
"2027-10-04": SUBSTITUTE, # 개천절(10/3 일)
|
|
"2027-10-11": SUBSTITUTE, # 한글날(10/9 토)
|
|
"2027-12-27": SUBSTITUTE, # 성탄절(12/25 토)
|
|
},
|
|
2028: {
|
|
"2028-01-26": "설날 연휴",
|
|
"2028-01-27": "설날",
|
|
"2028-01-28": "설날 연휴",
|
|
"2028-05-02": "부처님오신날",
|
|
"2028-10-02": "추석 연휴",
|
|
"2028-10-03": "추석", # 개천절과 같은 날
|
|
"2028-10-04": "추석 연휴",
|
|
"2028-10-05": SUBSTITUTE, # 추석 연휴가 개천절과 겹침
|
|
},
|
|
2029: {
|
|
"2029-02-12": "설날 연휴",
|
|
"2029-02-13": "설날",
|
|
"2029-02-14": "설날 연휴",
|
|
"2029-05-07": SUBSTITUTE, # 어린이날(5/5 토)
|
|
"2029-05-20": "부처님오신날",
|
|
"2029-05-21": SUBSTITUTE, # 부처님오신날(5/20 일)
|
|
"2029-09-21": "추석 연휴",
|
|
"2029-09-22": "추석",
|
|
"2029-09-23": "추석 연휴",
|
|
"2029-09-24": SUBSTITUTE, # 추석 연휴가 일요일과 겹침
|
|
},
|
|
2030: {
|
|
"2030-02-02": "설날 연휴",
|
|
"2030-02-03": "설날",
|
|
"2030-02-04": "설날 연휴",
|
|
"2030-02-05": SUBSTITUTE, # 설날 연휴가 일요일과 겹침
|
|
"2030-05-06": SUBSTITUTE, # 어린이날(5/5 일)
|
|
"2030-05-09": "부처님오신날",
|
|
"2030-09-11": "추석 연휴",
|
|
"2030-09-12": "추석",
|
|
"2030-09-13": "추석 연휴",
|
|
},
|
|
}
|
|
|
|
|
|
def holiday_name(d: date) -> str:
|
|
"""그날의 공휴일 이름. 공휴일이 아니면 빈 문자열.
|
|
|
|
한 날에 두 공휴일이 겹치면 "어린이날·부처님오신날" 처럼 이어 붙인다.
|
|
"""
|
|
names: list[str] = []
|
|
fixed = _FIXED_SOLAR.get((d.month, d.day))
|
|
if fixed:
|
|
names.append(fixed)
|
|
extra = _LUNAR_AND_SUBSTITUTE.get(d.year, {}).get(d.isoformat())
|
|
if extra and extra not in names:
|
|
names.append(extra)
|
|
return "·".join(names)
|
|
|
|
|
|
def is_holiday(d: date) -> bool:
|
|
"""공휴일(일요일 제외)이면 True. 일/토 색상은 요일로 따로 판정한다."""
|
|
return bool(holiday_name(d))
|