UTC to CET: time zone conversion

CET is UTC+1; CEST (Mar–Oct) is UTC+2

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.

Try it in the Time Zone Converter

2026-01-15 08:00 Thursday in UTC (UTC+00:00, UTC)

2026-01-15T08:00:00.000Z · in 14 days

See it in other zones

  • 2026-01-15 09:00Thursday UTC+01:00 CET
10 zones at a time at most.

Runs in your browser. Nothing you enter is sent anywhere.