Floating times can put deadlines on the wrong day
Some calendar-feed timestamps carry no timezone at all — DTSTART:20260708T235900, no Z, no TZID. RFC 5545 calls this floating local time and makes resolving it the reading app's responsibility. An app that guesses UTC shifts the event by your whole UTC offset — in US Central, enough to move an 11:59 PM deadline onto the next day. In building Margin's feed parser we resolve floating times in the reader's own browser timezone, which is what the spec intends.
What this looks like from a student's side
You subscribe a calendar app to your assignment feed, and the dates come out slightly wrong in a way that is easy to dismiss. A deadline you know is Wednesday shows on Thursday. Late-evening due times — the 11:59 PM ones — are the worst case, because they sit close enough to midnight that even a small offset carries them across the date line. The event is not missing and nothing errors; it is sorted into the wrong day, so it does not appear in the list you check tonight.
The size of the shift is your UTC offset, so readers far from UTC see the largest effect, and someone in London may never notice at all — which is part of why this goes unreported.
Why the format allows it
RFC 5545 §3.3.5 defines three forms of date-time value. One ends in Z and is fixed to UTC. One carries a TZID parameter naming a timezone. The third carries neither, and the spec's own term for it is floating: it is not tied to any timezone, and it is meant to be interpreted in the local time of wherever the event is being read.
That is a deliberate feature, not a malformed file. Floating time is how you express "9:00 AM, whatever 9:00 AM means where you are." The problem is that it hands the decision to the consuming application, and an application that quietly assumes UTC for anything without a Z produces a silent, systematic offset rather than an error.
How to tell whether this is what is happening to you
- Look for a pattern, not a one-off. A single wrong date is usually a data-entry issue. Every date in one feed shifted by the same amount, in the same direction, points at timezone handling.
- Compare the wrong time against the right one. If every item in the feed is off by the same number of hours and that number equals your UTC offset, timezone handling is the cause — items near midnight are the ones that cross into another date.
- Read the raw file. Save the
.icsand open it in a text editor. Find aDTSTARTline for an assignment you can verify. If it ends inZor carries;TZID=, then this quirk is probably not what you are looking at. If it is a bareYYYYMMDDTHHMMSS, it is floating, and how it renders is entirely up to the app showing it to you.
What you can do about it
- Set your calendar app's own timezone deliberately. If it has a home-timezone setting, that is typically the zone it uses for times that carry none — check it, especially after a move or a semester abroad. A zone you no longer live in is where your floating times will land.
- Try a different reader before you blame the feed. Because resolution is the consumer's job, two apps subscribed to the identical URL can legitimately show different days. If one is right, the feed is fine and the other app's handling is the issue.
- Trust the source page for anything close to midnight. For a deadline you actually care about, open the assignment in your course site and read the due time there rather than relying on the subscribed copy.
- Give yourself a working deadline earlier in the day. This is unglamorous, but an off-by-one in a calendar cannot hurt you if the work is finished the afternoon before.
Evidence
- RFC 5545 §3.3.5, "Date-Time" — defines the three date-time forms and specifies that a value with no
Zsuffix and noTZIDparameter is floating local time: such values "are not bound to any time zone in particular", and the recipient "SHOULD interpret the value as being fixed to whatever time zone the 'ATTENDEE' is in at any given moment." https://www.rfc-editor.org/rfc/rfc5545#section-3.3.5 (retrieved 2026-07-30) - Margin's own parser — the floating-time branch of
toIsoUtc()inextension/ical-parser.jsresolves timezone-less timestamps in the reader's browser timezone, falling back to UTC only where the browser cannot report a zone. This is our implementation and our experience of the problem; we are not making a claim about how any other tool behaves.