Руками и правда ад. Сначала разберись, откуда сайт вообще берёт пояс, источников там три и они независимые.
Первый: Intl.DateTimeFormat().resolvedOptions().timeZone, отдаёт имя зоны вроде Europe/Moscow. Второй: new Date().getTimezoneOffset(), отдаёт смещение в минутах. Третий: время в заголовке Date у самого запроса, оно берётся с машины.
Скрипты сверки сравнивают первое со вторым, а внимательные ещё смотрят, бьётся ли смещение с летним переводом для этой зоны. Подменять одно имя зоны бесполезно: смещение остаётся прежним, и расхождение вылезает в одну строку.
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
const off = -new Date().getTimezoneOffset() / 60;
console.log(tz, off, new Date().toString());
В нормальном антидетекте пояс переводится в режим по подключению, и браузер сам подтягивает имя зоны, смещение и локаль разом. Тогда сводить руками не приходится вообще.