Used in https://github.com/mhenc/airflow/blob/master/airflow/dag_processing/manager.py#L613

should be straighforward
start_date = date
            tzinfo = None if date.tzinfo else settings.TIMEZONE
            tz = pendulum.instance(date, tz=tzinfo).timezone
        self.timezone = tz or settings.TIMEZONE
        
        if "end_date" in self.default_args and self.default_args["end_date"]:
            if isinstance(self.default_args["end_date"], str):
                self.default_args["end_date"] = timezone.parse(
                    self.default_args["end_date"], timezone=self.timezone
                )
        self.start_date = timezone.convert_to_utc(start_date)
        self.end_date = timezone.convert_to_utc(end_date)
        
        if "start_date" in self.default_args:
            self.default_args["start_date"] = timezone.convert_to_utc(self.default_args["start_date"])
        if "end_date" in self.default_args:
            self.default_args["end_date"] = timezone.convert_to_utc(self.default_args["end_date"])
        
        scheduling_args = [schedule_interval, timetable, schedule]
        if not at_most_one(*scheduling_args):
            raise ValueError("At most one allowed for args 'schedule_interval', 'timetable', and 'schedule'.")
        if schedule_interval is not NOTSET:
            warnings.warn(
                "Param `schedule_interval` is deprecated and will be removed in a future release. "
                "Please use `schedule` instead. ",
                RemovedInAirflow3Warning,
                stacklevel=2,
            )
        if timetable is not None:
            warnings.warn(