# date_service.py from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from PyQt5.QtCore import QDate from config import EventConfig class DateService: """Centralized date operations and utilities""" @staticmethod def format_date_for_display(date, format_string=None): """Format a datetime object for display""" if format_string is None: format_string = EventConfig.DATE_FORMAT if isinstance(date, datetime): return date.strftime(format_string.replace('dd', '%d').replace('MM', '%m').replace('yyyy', '%Y')) elif isinstance(date, QDate): return date.toString(format_string) return str(date) @staticmethod def parse_date_from_string(date_string): """Parse a date string to datetime object""" try: return datetime.fromisoformat(date_string) except ValueError: # Try alternative formats try: return datetime.strptime(date_string, "%d.%m.%Y") except ValueError: raise ValueError(f"Unable to parse date string: {date_string}") @staticmethod def calculate_days_between(start_date, end_date): """Calculate number of days between two dates""" if isinstance(start_date, str): start_date = DateService.parse_date_from_string(start_date) if isinstance(end_date, str): end_date = DateService.parse_date_from_string(end_date) return (end_date.date() - start_date.date()).days + 1 @staticmethod def calculate_months_between(start_date, end_date): """Calculate number of months between two dates using relativedelta""" if isinstance(start_date, str): start_date = DateService.parse_date_from_string(start_date) if isinstance(end_date, str): end_date = DateService.parse_date_from_string(end_date) rd = relativedelta(end_date.date(), start_date.date()) return rd.years * 12 + rd.months + 1 @staticmethod def format_date_for_iso(date): """Format date for ISO string (yyyy-MM-dd)""" if isinstance(date, datetime): return date.strftime("%Y-%m-%d") elif isinstance(date, QDate): return date.toString("yyyy-MM-dd") return str(date) @staticmethod def get_current_date(): """Get current date as datetime""" return datetime.now()