To convert CET to IST, add 4 hours 30 minutes: 09:00 CET is 13:30 IST. From the last Sunday in March to the last Sunday in October, Central Europe is on CEST, UTC+2, and the gap shrinks to 3 hours 30 minutes: 09:00 CEST is 12:30 IST. India stays on UTC+5:30 all year.
Through 2026
Jan 1 – Mar 29 CET → IST UTC+1 → UTC+5:30 4:30
Mar 29 – Oct 25 CEST → IST UTC+2 → UTC+5:30 3:30
Oct 25 – Dec 31 CET → IST UTC+1 → UTC+5:30 4:30
Europe changes at 01:00 UTC, which is 06:30 in India, on March 29 and October 25.
A worked conversion
The tool below starts at 09:00 in Berlin on Thursday, January 15, 2026:
2026-01-15 09:00 Europe/Berlin (UTC+01:00, CET)
2026-01-15 13:30 Asia/Kolkata (UTC+05:30, IST)
Meeting window
Europe’s morning is India’s afternoon. With 09:00 to 18:00 in India and a 09:00 start in Berlin, the shared hours in winter are 09:00 to 13:30 CET, 13:30 to 18:00 IST: four and a half hours. In summer they grow to five and a half, 09:00 to 14:30 CEST, which is 12:30 to 18:00 IST. India’s working day starts at 04:30 CET (05:30 CEST), so anything sent first thing in India is waiting when Europe logs on.
Abbreviation traps
IST here is India Standard Time, but in Europe the same letters also mean Irish Standard Time, Ireland’s summer clock at UTC+1, and Israel Standard Time is UTC+2. CET is the winter name; in summer it’s CEST. In code, use Europe/Berlin (or Europe/Paris, Europe/Madrid) and Asia/Kolkata: GNU date with TZ=IST silently gives UTC, and Python’s ZoneInfo("IST") raises.
In code
from datetime import datetime
from zoneinfo import ZoneInfo
datetime(2026, 7, 15, 9, 0, tzinfo=ZoneInfo("Europe/Berlin")).astimezone(ZoneInfo("Asia/Kolkata")).isoformat()
# '2026-07-15T12:30:00+05:30'
TZ=Asia/Kolkata date -d 'TZ="Europe/Berlin" 2026-01-15 09:00' # GNU date
# Thu Jan 15 13:30:00 IST 2026
new Date('2026-01-15T08:00:00Z').toLocaleString('en-IN', { timeZone: 'Asia/Kolkata', timeZoneName: 'short' })
// '15/1/2026, 1:30:00 pm IST'