Before changing an event’s time, identify how the source represents it. Three similar-looking date-times can mean different things, and all-day events are a fourth case.

UTC: an absolute instant

DTSTART:20261102T140000Z is 14:00 UTC. The Z is significant. A receiving app displays that instant in the viewer’s selected time zone.

TZID: local time in a named zone

DTSTART;TZID=America/New_York:20261102T090000 expresses a wall-clock time with a named time zone. A VTIMEZONE component describes the rules used by the file. Some clients recognize standard zone names without a definition, but depending on that behavior can create differences between apps.

Floating local time

DTSTART:20261102T090000 has no zone or Z. It is a floating time. Do not assume it means UTC. The receiving calendar’s handling and chosen zone matter. CalPorter’s CSV converter and event generator make floating local times and clearly label them.

All-day events use dates

DTSTART;VALUE=DATE:20261102 is a date, not midnight UTC. An exclusive end of November 3 makes it a one-day event on November 2. Converting it into a midnight timestamp can move it to another date for some viewers.

What to check

Inspect DTSTART, DTEND, the TZID parameter and any VTIMEZONE component. Then check the destination calendar’s zone. For repeating meetings, test dates on both sides of a daylight-saving transition. CalPorter’s viewer preserves these distinctions; it does not guess an absent zone or claim to simulate every calendar client.

Sources: RFC 5545 date-time and time-zone definitions and Google’s time-zone import troubleshooting.