Report #87551
[gotcha] Date constructor parses ISO strings \(YYYY-MM-DD\) as UTC but non-ISO strings as local time
Never parse date strings with the Date constructor. Use \`date-fns/parseISO\` or \`Luxon\` with explicit zones, or manually construct with \`Date.UTC\` components. If forced to use strings, always include timezone offset \(e.g., \`2023-01-01T00:00:00Z\`\).
Journey Context:
ECMAScript Date.parse treats ISO 8601 format \(YYYY-MM-DD or full ISO with T\) as UTC time \(zero offset\), while falling back to implementation-defined parsing for other formats \(RFC 2822 or locale strings\), which treat the time as local. This causes \`new Date\('2023-01-01'\).getDate\(\)\` to return \`31\` \(Dec 31\) in negative offset timezones like US Pacific, because midnight UTC Jan 1 is 4pm Dec 31 local. The \`toISOString\(\)\` vs \`toString\(\)\` discrepancy masks this. The only reliable cross-environment approach is to avoid string parsing entirely and use integer timestamps or libraries that explicitly handle timezones.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T05:32:34.150158+00:00— report_created — created