def get_start_date(date_value: Union[str, datetime, date], timezone: str = "UTC") -> datetime:
    """
    Takes value from DAG config and generates valid start_date. Defaults to
    today, if not a valid date or relative time (1 hours, 1 days, etc.)

    :param date_value: either a datetime (or date) or a relative time as string
    :type date_value: Uniont[datetime, date, str]
    :param timezone: string value representing timezone for the DAG
    :type timezone: str
    :returns: datetime for start_date
    :type: datetime.datetime
    """
    try:
        local_tz: pendulum.Timezone = pendulum.timezone(timezone)
    except Exception as e:
        raise Exception(f"Failed to create timezone; err: {e}")
    if isinstance(date_value, date):
        return datetime.combine(date=date_value, time=datetime.min.time()).replace(tzinfo=local_tz)
    if isinstance(date_value, datetime):
        return date_value.replace(tzinfo=local_tz)
    rel_delta: timedelta = get_time_delta(date_value)
    now: datetime = (
        datetime.today()
            .replace(hour=0, minute=0, second=0, microsecond=0)
            .replace(tzinfo=local_tz)
    )
    if not rel_delta:
        return now
    return (now - rel_delta)