| | import holidays |
| | from datetime import date, timedelta |
| | import logging |
| |
|
| | logger = logging.getLogger(__name__) |
| |
|
| | |
| | try: |
| | |
| | vn_holidays = holidays.VN(years=[2024, 2025, 2026]) |
| | logger.info(f"[date_utils] VN holidays loaded for 2024-2026. Total: {len(vn_holidays)}") |
| | except Exception as e: |
| | logger.error(f"[date_utils] ํด์ผ ์ ๋ณด ๋ก๋ ์คํจ: {e}") |
| | print(f"[date_utils] ํด์ผ ์ ๋ณด ๋ก๋ ์คํจ: {e}") |
| | vn_holidays = {} |
| |
|
| | def is_holiday(d: date) -> bool: |
| | """ |
| | ํด๋น ๋ ์ง๊ฐ ์ฃผ๋ง(ํ ,์ผ)์ด๊ฑฐ๋ ๋ฒ ํธ๋จ ๊ณตํด์ผ์ธ์ง ํ์ธ |
| | """ |
| | |
| | if d.weekday() >= 5: |
| | return True |
| | |
| | |
| | if d in vn_holidays: |
| | return True |
| | |
| | return False |
| |
|
| | def add_business_days(start_date: date, days: int) -> date: |
| | """ |
| | start_date๋ก๋ถํฐ days๋งํผ์ ์
๋ฌด์ผ(Business Days)์ ๋ํ๊ฑฐ๋ ๋บ ๋ ์ง๋ฅผ ๋ฐํ |
| | - days > 0: ๋ฏธ๋๋ก ์ด๋ |
| | - days < 0: ๊ณผ๊ฑฐ๋ก ์ด๋ |
| | - days == 0: start_date๊ฐ ํด์ผ์ด๋ฉด ๋ค์ ์
๋ฌด์ผ(๋ฏธ๋ ๋ฐฉํฅ) ๋ฐํ, ์๋๋ฉด ๊ทธ๋๋ก ๋ฐํ |
| | """ |
| | current_date = start_date |
| | |
| | |
| | if days == 0: |
| | while is_holiday(current_date): |
| | current_date += timedelta(days=1) |
| | return current_date |
| |
|
| | |
| | step = 1 if days > 0 else -1 |
| | days_left = abs(days) |
| | |
| | while days_left > 0: |
| | current_date += timedelta(days=step) |
| | |
| | if not is_holiday(current_date): |
| | days_left -= 1 |
| | |
| | return current_date |
| |
|
| | def get_holidays_in_range(start_date: date, end_date: date) -> list: |
| | """ |
| | start_date ~ end_date (inclusive) ๊ธฐ๊ฐ ๋ด์ ํด์ผ ๋ชฉ๋ก(date ๊ฐ์ฒด) ๋ฐํ |
| | """ |
| | holidays_list = [] |
| | |
| | if start_date > end_date: |
| | start_date, end_date = end_date, start_date |
| | |
| | curr = start_date |
| | while curr <= end_date: |
| | if is_holiday(curr): |
| | holidays_list.append(curr) |
| | curr += timedelta(days=1) |
| | return holidays_list |
| |
|