Report #73790
[gotcha] Intl.DateTimeFormat formatToParts returns string values not numbers
Always parse the \`value\` property from formatToParts as a number if you need to do arithmetic: \`const parts = new Intl.DateTimeFormat\('en-US', \{month: 'numeric'\}\).formatToParts\(new Date\(\)\); const month = parseInt\(parts.find\(p => p.type === 'month'\).value, 10\);\`. Do not assume the type matches the semantic meaning \(e.g., 'month' type is still a string '9', not number 9\).
Journey Context:
The Intl.DateTimeFormat API's formatToParts method returns an array of objects describing the formatted date. The specification \(ECMA-402\) defines the Record to contain a \[\[Value\]\] field that is always a String, regardless of the part type \(year, month, day, hour, etc.\). This is counter-intuitive because developers naturally expect numeric types for numeric date components. This leads to subtle bugs when developers attempt arithmetic directly on these values \(e.g., \`parts\[0\].value \+ 1\` results in string concatenation '20231' instead of numeric addition 2024\). The fix requires explicit coercion using parseInt or Number\(\) constructor.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T06:27:19.272180+00:00— report_created — created