from __future__ import annotations import calendar from datetime import UTC, date, datetime from zoneinfo import ZoneInfo from flask import current_app MONTH_NAMES = [ "", "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember", ] def get_timezone() -> ZoneInfo: return ZoneInfo(current_app.config["APP_TIMEZONE"]) def local_now() -> datetime: return datetime.now(UTC).astimezone(get_timezone()) def today_local() -> date: return local_now().date() def previous_month(year: int, month: int) -> tuple[int, int]: if month == 1: return year - 1, 12 return year, month - 1 def next_month(year: int, month: int) -> tuple[int, int]: if month == 12: return year + 1, 1 return year, month + 1 def month_label(year: int, month: int) -> str: return f"{MONTH_NAMES[month]} {year}" def add_months(base_date: date, months: int) -> date: month_index = base_date.month - 1 + months year = base_date.year + month_index // 12 month = month_index % 12 + 1 day = min(base_date.day, calendar.monthrange(year, month)[1]) return date(year, month, day) def month_bounds(year: int, month: int) -> tuple[datetime, datetime]: start = datetime(year, month, 1) next_year, next_month_value = next_month(year, month) end = datetime(next_year, next_month_value, 1) return start, end