Troubleshooting
Calendar QR code saves the wrong time
A calendar QR shows the wrong time when DTSTART is written as floating local time with no Z suffix and no TZID, so every phone interprets it in its own zone. Encode timed events in UTC with a Z suffix (phones convert correctly), or use an all-day event, which has no timezone at all.
Three ways to write a time, one of them a trap
A calendar QR code carries an iCalendar (RFC 5545) VEVENT, and its DTSTART line can
express the start time three ways:
| Form | Example | Meaning |
|---|---|---|
| UTC | DTSTART:20260901T050000Z |
Absolute instant; every phone converts to its own zone |
| Zoned | DTSTART;TZID=Asia/Kolkata:20260901T103000 |
Local time in a named zone; strict parsers want a matching VTIMEZONE block |
| Floating | DTSTART:20260901T103000 |
"10:30", in whatever zone the reading device is in |
The floating form is the trap. It looks identical to the zoned form minus the label, so generators emit it constantly, and it means something different on every phone that scans it.
The classic failure
An organiser in Mumbai encodes a 10:30 meeting. The generator writes floating time:
DTSTART:20260901T103000 broken ("10:30 local", wherever scanned
DTSTART:20260901T050000Z fixed) 10:30 IST, 07:00 CEST, 06:00 BST
Everyone in Mumbai sees 10:30 and nothing seems wrong. The attendee scanning from Berlin also sees 10:30 (their 10:30), and dials in four and a half hours late. Floating time fails only across zones, which is why it survives testing: the person who makes the code is almost never in a different timezone from themselves.
The off-by-offset failure
The opposite bug: a generator that appends Z to whatever you typed without converting.
Type 10:30 meaning IST, get DTSTART:20260901T103000Z, which is 16:00 IST. The event is
shifted by exactly your UTC offset, which is the fingerprint to look for: an event
consistently 5 h 30 min off in India, 1 h off in the UK in summer.
The correct pipeline converts the wall-clock time you entered into UTC before appending
Z. UseQR's calendar generator does exactly this: timed events are
normalised to UTC basic format with the Z suffix, so the code carries one absolute
instant and every phone renders it in its own zone. The zoned TZID form is deliberately
avoided in QR payloads: it requires a VTIMEZONE definition to be fully portable, which
bloats the payload for no benefit over UTC.
All-day events have no timezone at all
An all-day event uses a date, not a date-time:
DTSTART;VALUE=DATE:20260901
No zone, no offset, no conversion: 1 September is 1 September everywhere. For deadlines,
festivals, opening days and anything without a meaningful clock time, encoding all-day
sidesteps every failure on this page. (One quirk to know: DTEND for all-day events is
exclusive, so a one-day event on the 1st ends VALUE=DATE:20260902.)
Verify before printing
Decode the finished code with our scanner and read the DTSTART line against
the table above. Then do the only test that fully settles it: scan it on a phone set to a
different timezone (change the zone in settings, or ask a remote colleague) and check the
saved event's local time. Event and invitation printing runs
in the thousands. This check costs one minute. For events with attendees across zones,
put the city and zone in the event title or description text as well, so humans can catch
what parsers miss. More on event-day usage in
QR codes for events.
FAQ
Why does my calendar QR code show a different time on other phones?
The event time is encoded as floating local time (no Z suffix, no TZID), so each phone reads it in its own timezone. Re-encode the start time in UTC with a Z suffix and every phone will convert it correctly.
Why is my event exactly a few hours off for everyone?
The generator stamped Z onto the local time you typed without converting to UTC, shifting the event by your UTC offset. Regenerate with a tool that converts wall-clock time to UTC before writing DTSTART.
Should I use UTC or TZID in a calendar QR code?
UTC. It needs no VTIMEZONE definition, keeps the payload small, and renders correctly in every calendar app. TZID is designed for recurring events that must track a zone's DST rules, rarely what a printed QR encodes.
Do all-day events have timezone problems?
No. All-day events use VALUE=DATE with a bare date and no time component, so nothing is converted anywhere. Note that DTEND is exclusive: a single-day event on 1 September ends with the date 2 September.
Try it: free, no signup
Related
- QR code not scanning: the checklist, Work through these in order, because they are ranked by how often they are the actual cause: quiet zone, contrast, size for distance, glare, blur from…
- vCard QR code imports with missing or wrong fields, Two causes cover almost all of these: unescaped commas and semicolons inside a value, which split the field, and a missing FN line, which leaves the…
- Email QR code body loses its line breaks, mailto bodies need %0D%0A line breaks per RFC 6068, %20 spaces and %2B plus signs. The encoding traps, the density cost, and verified payload examples.
- SMS QR code body not prefilled on iPhone, The sms URI split its body syntax between platforms for years. Why SMSTO is the form that works everywhere today, with a payload test matrix.