December 2025
6 Min
ICS Timezone Wrong in Google Calendar: Why Events Shift and How to Fix It
This article explains why Google Calendar shifts event times, how timezone normalisation really works, and what you must do to prevent silent time drift.
Sam Benson
Dec 15, 2025
Timezone bugs are some of the hardest calendar issues to debug because nothing looks broken. The ICS file parses. The event appears. The times look correct in your code. And yet users report that the meeting is an hour early, an hour late, or drifting after updates.
Google Calendar is often blamed for this behaviour, but the reality is more subtle. Google is doing exactly what it is designed to do when it encounters ambiguous or incomplete timezone data. The problem is that ICS gives vendors far too much room to interpret time differently.
This article explains why Google Calendar shifts event times, how timezone normalisation really works, and what you must do to prevent silent time drift.
ICS supports timezones, but it does not define a single authoritative timezone database. Instead, it allows clients to interpret TZID values using their own internal rules.
This means:
When you send an event with a TZID, you are assuming the receiving client understands it the same way you do. That assumption is often wrong.
If Google does not recognise or trust the timezone definition you provide, it will normalise the event into UTC internally.
Once that happens, future updates behave differently than you expect.
Google Calendar prioritises consistency over fidelity. If it cannot reliably interpret a timezone, it chooses a safe internal representation.
This usually happens when:
When this occurs, Google converts DTSTART and DTEND into UTC and stores the event that way. The UI may still display the event in the user’s local time, but internally the event is now anchored to UTC.
That internal conversion is what causes later updates to appear ignored or misaligned.
The most common mistake is assuming that including a TZID is enough.
Example:
DTSTART;TZID=Europe/London:20250328T100000
If Google does not trust the accompanying VTIMEZONE block, it ignores the TZID and resolves the time itself.
Later, when you send an update using the same local time, Google compares it to the stored UTC value and decides nothing has changed.
From your perspective, the update should apply. From Google’s perspective, the event already matches.
Many teams report that initial event creation looks correct, but updates break the time.
This happens because:
This creates the illusion that Google ignored your update, when in reality your update did not differ from Google’s canonical representation.
DST boundaries are where most timezone bugs surface.
Common failure patterns include:
Google trusts its own DST logic more than the ICS file. If your VTIMEZONE rules disagree with Google’s, Google wins.
This is why events appear to shift by exactly one hour.
Outlook tends to respect VTIMEZONE blocks more strictly. If the block is present and valid, Outlook uses it. If not, Outlook may reject the event or display a warning.
Apple Calendar often trusts the system timezone and applies fewer corrections, which can result in different visible times across devices.
Google’s approach is more aggressive. It normalises first and asks questions never.
This is why timezone bugs often appear Google specific, even though the root cause is ICS ambiguity.
BEGIN:VEVENT DTSTART;TZID=Europe/London:20250328T100000 DTEND;TZID=Europe/London:20250328T110000 END:VEVENT
Without a matching, valid VTIMEZONE block, Google resolves this using its own rules. If those rules differ from yours, the stored event diverges immediately.
The most reliable approach when targeting Google is to remove ambiguity.
You can do this by:
UTC based events are boring, but they are predictable.
DTSTART:20250328T090000Z DTEND:20250328T100000Z
This removes Google’s need to interpret timezone rules at all.
Recurring events combine timezone logic with RRULE evaluation. Google may:
When you later update the series, your local time representation no longer matches Google’s internal expansion.
This is why recurring meetings are the most common source of timezone complaints.
Do not assume one representation works everywhere.
Choose one representation and stick to it.
Do not regenerate times from user input without reconciling DST.
Small formatting differences can cause Google to reinterpret the event.
Synara resolves timezone ambiguity before the ICS file is ever generated. When you send an event through Synara, it:
This avoids the class of bugs where Google silently shifts times or ignores updates because of timezone normalisation.
Google Calendar shifts event times when:
Timezone bugs are not random. They are the result of ICS giving clients too much freedom.
Once you understand how Google resolves time internally, these failures become predictable and avoidable.
Synara gives you deterministic calendar behaviour across Google, Outlook and Apple without maintaining timezone logic yourself. You send a clean JSCalendar object and Synara handles timezone resolution, DST rules, vendor specific formatting, update propagation and recurring event consistency.
If you are tired of chasing one hour offsets and invisible update failures, Synara ensures every attendee sees the same time on every calendar.
Learn more → synara.events
API docs → synara.events/docs
You might also like
Browse all articles