Report #11644
[gotcha] Temporal.PlainDate.add\(\) crosses DST boundaries incorrectly
PlainDate represents a calendar date without time or zone. Adding days advances the calendar date, not 24 hours. For DST-aware arithmetic or exact hour calculations, use Temporal.ZonedDateTime or Temporal.Instant.
Journey Context:
Developers migrating from moment.js or date-fns often assume 'add 1 day' means 'add 24 hours'. Temporal strictly separates calendar dates \(PlainDate\) from exact timestamps \(Instant\) and zoned datetimes \(ZonedDateTime\). PlainDate.add\(\{days: 1\}\) advances to the next calendar date \(e.g., Jan 1 -> Jan 2\) regardless of whether that period includes a 23-hour or 25-hour DST transition. It has no concept of time zones or offsets. If you need 'same time tomorrow' respecting DST \(e.g., 2:30 PM stays 2:30 PM even if clocks change\), you must use ZonedDateTime. Using PlainDate for time-of-day arithmetic across DST boundaries results in 1-hour shifts.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T13:50:01.377850+00:00— report_created — created