To convert UTC to CET, add 1 hour: 08:00 UTC is 09:00 CET. From the last Sunday in March to the last Sunday in October, Central Europe is on CEST, UTC+2, and you add 2: 08:00 UTC is 10:00 CEST.
Through 2026
Jan 1 – Mar 29 CET UTC+1 08:00 UTC is 09:00
Mar 29 – Oct 25 CEST UTC+2 08:00 UTC is 10:00
Oct 25 – Dec 31 CET UTC+1 08:00 UTC is 09:00
The EU changes at 01:00 UTC, everywhere at once. On March 29 Berlin’s clocks jump from 02:00 to 03:00. On October 25 they go back from 03:00 to 02:00, so 02:30 happens twice that night; the tool takes the first, on CEST, which is 00:30 UTC.
A worked conversion
The tool below starts at 08:00 UTC on Thursday, January 15, 2026:
2026-01-15 08:00 UTC (UTC+00:00, UTC)
2026-01-15 09:00 Europe/Berlin (UTC+01:00, CET)
Who’s on CET
Most of continental Europe: Germany, France, Spain, Italy, the Netherlands, Belgium, Switzerland, Austria, Poland, Czechia, Denmark, Norway, Sweden and others. Not the UK, Ireland or Portugal, which are on UTC+0 in winter, and not Greece, Finland or Romania, which are on UTC+2. Spain’s Canary Islands are on UTC+0 too.
The abbreviation trap
CET is the winter name, and “CET” in July usually means CEST. Hard-coding +01:00 is wrong for about seven months of the year. In code, CET is itself a tz database name, and it does follow the EU rules: Python’s ZoneInfo("CET") gives +02:00 in July, and Node.js 22 resolves it to Europe/Brussels. Still, name a city, Europe/Berlin or Europe/Paris, so the data follows that country. The tool below reads CET and CEST as Europe/Brussels, and its note says which one is in effect.
The printed label depends on the locale: en-GB writes CEST, en-US writes GMT+2.
In code
new Date('2026-07-15T08:00:00Z').toLocaleString('en-GB', { timeZone: 'Europe/Berlin', timeZoneName: 'short' })
// '15/07/2026, 10:00:00 CEST'
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
datetime(2026, 7, 15, 8, 0, tzinfo=timezone.utc).astimezone(ZoneInfo("Europe/Berlin")).strftime("%H:%M %Z")
# '10:00 CEST'
TZ=Europe/Berlin date -d '2026-01-15 08:00 UTC'
# Thu Jan 15 09:00:00 CET 2026
Scheduling
A job set for 08:00 UTC runs at 09:00 in Berlin in winter and 10:00 in summer. To keep 09:00 local all year, schedule it in Europe/Berlin, or use 07:00 UTC from late March to late October.