Store recurrence intent alongside resolved instants
A recurring 09:00 meeting is not one UTC timestamp plus seven days. Store the local date and time, IANA zone identifier, recurrence rule, disambiguation policy, and the resulting instant for each occurrence. RFC 5545: iCalendar defines the calendar and recurrence model.
Resolve skipped and repeated local times
When clocks skip 02:30, choose reject, move forward, or another product rule. When a local time repeats, choose earlier or later offset. Recompute future occurrences after tzdb changes while preserving historical resolved instants and decisions. IANA Time Zone Database supplies the time-zone rules used to resolve local times.
Preserve the user’s scheduling intent
Store local date and time, IANA zone identifier, recurrence rule, and explicit gap/fold policy. Compute upcoming UTC instants as derived values. A fixed offset such as UTC+2 is not a zone: it cannot represent future daylight-saving changes or political rule updates.
For “09:00 Europe/Athens every weekday,” decide what happens when a local time does not exist and which occurrence to choose when a clock repeats. For “every 24 hours,” say that instead; it is a different promise from “same local time tomorrow.”
Recompute without rewriting history
Pin or record the time-zone database version used to calculate each execution. When rules update, recompute future occurrences and surface material changes, but keep past execution instants immutable for audit. Long look-ahead caches need invalidation when the zone data changes.
Test spring gaps, autumn folds, month ends, leap days, a rule update, and a user changing zones. Idempotency should key the logical schedule occurrence, not only the UTC timestamp, so recalculation does not run it twice. Take one existing scheduled job and write its local intent and ambiguity policy; if only a UTC timestamp remains, the product cannot reliably explain the next occurrence. Display the chosen zone and next local occurrence to users so a mistaken device default is visible before the schedule is saved.
Sources are linked throughout this guide. Product capabilities can change; consult the linked documentation for your deployment.
Read our editorial approach ↗