To convert CET to EST, subtract 6 hours: 15:00 CET is 09:00 EST. In summer both sides move forward an hour, so 15:00 CEST is 09:00 EDT, still 6 hours. The exception is the four weeks a year when only one side has changed: the US switches on the second Sunday of March and the first Sunday of November, the EU on the last Sundays of March and October.
Through 2026
Jan 1 – Mar 8 CET → EST 6 hours
Mar 8 – Mar 29 CET → EDT 5 hours
Mar 29 – Oct 25 CEST → EDT 6 hours
Oct 25 – Nov 1 CET → EDT 5 hours
Nov 1 – Dec 31 CET → EST 6 hours
A worked conversion
The tool below starts at 15:00 in Berlin on Thursday, January 15, 2026:
2026-01-15 15:00 Europe/Berlin (UTC+01:00, CET)
2026-01-15 09:00 America/New_York (UTC-05:00, EST)
Move the date to March 20 and the same 15:00 CET is 10:00 EDT; on October 28 it’s 10:00 EDT again.
Meeting window
With 09:00 to 17:00 on both sides, the overlap is 15:00 to 17:00 in Berlin, 09:00 to 11:00 in New York: two hours. In the 5-hour weeks it grows to three, from 14:00 CET. A weekly call booked in one city’s time moves by an hour in the other for those weeks, so check invites in March and at the end of October.
Abbreviation traps
CET is the winter name. From March 29 to October 25, 2026, Berlin, Paris, Madrid, Rome and Warsaw are on CEST, UTC+2. The UK, Ireland and Portugal aren’t on CET at all, and neither are Greece or Finland, which are an hour ahead of it. EST is New York’s winter name; it’s EDT from March 8 to November 1.
In code, CET is a real tz database name, and unlike EST it does switch to CEST in summer (Node.js 22 resolves it to Europe/Brussels). It works, but name a city, Europe/Berlin or Europe/Paris, so the data follows that country’s rules.
In code
from datetime import datetime
from zoneinfo import ZoneInfo
datetime(2026, 3, 20, 15, 0, tzinfo=ZoneInfo("Europe/Berlin")).astimezone(ZoneInfo("America/New_York")).isoformat()
# '2026-03-20T10:00:00-04:00'
TZ=America/New_York date -d 'TZ="Europe/Berlin" 2026-01-15 15:00' # GNU date
# Thu Jan 15 09:00:00 EST 2026
new Date('2026-01-15T14:00:00Z').toLocaleString('en-US', { timeZone: 'America/New_York', timeZoneName: 'short' })
// '1/15/2026, 9:00:00 AM EST'