soyailabs / app /utils /date_utils.py
SOY NV AI
Update routes, date utils, scripts and templates
bdeeba6
import holidays
from datetime import date, timedelta
import logging
logger = logging.getLogger(__name__)
# ๋ฒ ํŠธ๋‚จ ํœด์ผ ๊ฐ์ฒด ์ƒ์„ฑ (์บ์‹ฑ)
try:
# 2024~2026๋…„ ํœด์ผ ๋ฏธ๋ฆฌ ๋กœ๋“œ (๋ฒ”์œ„ ๋ช…์‹œ๊ฐ€ ์•ˆ์ „ํ•  ์ˆ˜ ์žˆ์Œ)
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:
"""
ํ•ด๋‹น ๋‚ ์งœ๊ฐ€ ์ฃผ๋ง(ํ† ,์ผ)์ด๊ฑฐ๋‚˜ ๋ฒ ํŠธ๋‚จ ๊ณตํœด์ผ์ธ์ง€ ํ™•์ธ
"""
# ์ฃผ๋ง ์ฒดํฌ (5: ํ† ์š”์ผ, 6: ์ผ์š”์ผ)
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
# 0์ผ์ธ ๊ฒฝ์šฐ: ์‹œ์ž‘์ผ์ด ํœด์ผ์ด๋ฉด ํ‰์ผ์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์ „์ง„
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