Airflow works in UTC unless you tell it otherwise. A DAG with schedule="0 6 * * *" and a start date without a timezone runs at 06:00 UTC, which is 08:00 in Rome in summer and 07:00 in winter. To run at 06:00 local time all year, give the DAG a timezone.

Copy and paste

Timezone on the start date. The cron expression is read in the timezone of start_date:

import pendulum
from airflow.sdk import dag

@dag(
    schedule="0 6 * * *",   # 06:00 every day, Rome time
    start_date=pendulum.datetime(2026, 1, 1, tz="Europe/Rome"),
    catchup=False,
)
def morning_report():
    ...

morning_report()

Timezone on the schedule:

import pendulum
from airflow.sdk import dag, CronTriggerTimetable

@dag(
    schedule=CronTriggerTimetable("0 6 * * *", timezone="Europe/Rome"),
    start_date=pendulum.datetime(2026, 1, 1, tz="Europe/Rome"),
    catchup=False,
)
def morning_report():
    ...

morning_report()

A default for every DAG, used when a start date has no timezone:

export AIRFLOW__CORE__DEFAULT_TIMEZONE=Europe/Rome

Daylight saving time

With the timezone set, the DAG stays at 06:00 local time and its time in UTC moves when the clocks change. The runs around the change of 29 March 2026:

Run, Rome time In UTC
Fri 27 March, 06:00 05:00
Sat 28 March, 06:00 05:00
Sun 29 March, 06:00 04:00
Mon 30 March, 06:00 04:00

Avoid scheduling between 02:00 and 03:00. On the night the clocks go forward that hour does not exist, and a DAG at "30 2 * * *" runs at 03:30 instead. On the night they go back the hour happens twice, and the DAG runs once.

The date inside the run is still UTC

The schedule follows local time, but ds and logical_date stay in UTC. That matters for runs close to midnight: a DAG at "30 0 * * *" in Rome starts on 15 May at 00:30 local time, which is 22:30 UTC on 14 May.

"{{ ds }}"                                                 # 2026-05-14
"{{ logical_date.in_timezone('Europe/Rome') | ds }}"       # 2026-05-15

If your query needs the local date, convert logical_date as in the second line, or schedule the DAG after 02:00 local time so the two dates are the same.

The UI shows UTC

The Airflow UI shows times in UTC. To see them in your timezone, open the User menu and choose Timezone. That setting changes only what you see, not when the DAG runs.

Tested with Airflow 3.3.2.

References