from datetime import datetime, timezone

def parse_time(val: str | None):
    if not val:
        return None
    try:
        h,m = val.split(':', 1)
        from datetime import time
        return time(int(h), int(m))
    except Exception:
        return None

def parse_cost(val: str | None):
    if not val:
        return None
    try:
        return float(val)
    except Exception:
        return None

    if not val:
        return None
    dt = datetime.fromisoformat(val)
    # make TZ-aware (assume local if naive; convert to UTC)
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=timezone.utc)
    return dt

def parse_dt(val: str | None) -> datetime | None:
    if not val:
        return None
    dt = datetime.fromisoformat(val)
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=timezone.utc)
    return dt

