Задайте в Playwright браузерный timezoneId, зафиксируйте явный момент времени в UTC, а затем проверьте дату, которую показывает ваша страница. Часовой пояс раннера Node держите отдельно: настройка браузера его не меняет. Playwright описывает это различие в разделе о локали и часовом поясе.
Скрипт для скачивания ниже даёт 12 воспроизводимых австралийских случаев: Сидней и Брисбен в два сезона, получасовое смещение Брокен-Хилла и 30-минутный переход на летнее время на острове Лорд-Хау. Он сам поднимает небольшую страницу на 127.0.0.1, считывает часы, отрисованные в Chromium, и сохраняет проверки в JSON. Ни прокси, ни учётные данные не нужны.
Запустите проверку часов
Нужен Node.js 24. В оболочке macOS или Linux:
mkdir australia-clock-demo
cd australia-clock-demo
curl --fail --silent --show-error --output australia-clock-check.mjs https://ipvolt.com/downloads/australia-clock-check.mjs
npm install --no-audit --no-fund --save-exact playwright@1.63.0
npx playwright install chromium
TZ=UTC node australia-clock-check.mjs > results-utc.jsonСкрипт и README доступны напрямую. Сравните свой вывод с эталонным JSON, где есть все проверки и описание окружения, или с эталонным CSV, где собраны отдельные поля строк.
Успешный запуск завершается с кодом 0 и сообщает summary.allPassed: true, а также total: 12 и passed: 12. Сюда входят ожидаемые соотношения часов и проверки запросов и ошибок. Код 1 вместе с JSON результата означает, что не прошла одна из проверок. Ошибка запуска или зависимостей в стандартном потоке ошибок означает сбой настройки; если Chromium не стартует в Linux, проверьте системные зависимости браузеров Playwright.
Для каждой строки скрипт создаёт новый контекст браузера, задаёт его timezoneId и до загрузки страницы вызывает page.clock.setFixedTime(new Date(test.utc)). Входное значение UTC оканчивается на Z, поэтому оно обозначает один и тот же момент при любом окружении раннера. setFixedTime фиксирует значения, которые возвращают Date.now() и new Date(), а таймеры продолжают работать как обычно; эта фикстура проверяет отрисованные даты. API фиксированного времени в Playwright
Сохраните австралийские исключения в тестовых случаях
Эти восемь строк используют полночь по UTC 15 января 2026 года и 15 июля 2026 года. Смещения ниже указаны к востоку от UTC. В JSON они выражены в минутах, со знаком, противоположным getTimezoneOffset() в JavaScript.
timezoneId браузера | Январь: местное время / смещение от UTC | Июль: местное время / смещение от UTC |
|---|---|---|
Australia/Sydney | 11:00 / +11:00 | 10:00 / +10:00 |
Australia/Brisbane | 10:00 / +10:00 | 10:00 / +10:00 |
Australia/Broken_Hill | 10:30 / +10:30 | 09:30 / +09:30 |
Australia/Lord_Howe | 11:00 / +11:00 | 10:30 / +10:30 |
Сидней и Брисбен совпадают в июле, но в январе расходятся на час. Брокен-Хилл и Лорд-Хау тоже не дают свести «NSW» к одному ожидаемому времени. В определениях времени и исключениях Нового Южного Уэльса описаны эти смещения и сказано, что в Квинсленде нет летнего времени. Эталонные результаты фиксируют, что этот запуск Chromium отрисовал в заданные моменты.
Оставшиеся четыре строки охватывают смоделированные переходы 4 октября 2026 года. В каждой паре UTC сдвигается на одну секунду:
| Пояс браузера | Снимки UTC 3 октября 2026 года | Местные снимки 4 октября 2026 года | Изменение смещения |
|---|---|---|---|
Australia/Lord_Howe | 15:29:59 → 15:30:00 | 01:59:59 → 02:30:00 | +10:30 → +11:00 |
Australia/Sydney | 15:59:59 → 16:00:00 | 01:59:59 → 03:00:00 | +10:00 → +11:00 |
Это синтетические снимки с фиксированным временем, выполненные 26 сентября 2026 года по UTC. Октябрьские входные значения имитируют будущие моменты по правилам, проверенным в тот день; они не фиксируют реальный переход и не проверяют таймер, работающий во время него. Ожидаемые даты и смещения опираются на сезонные даты NSW и правила IANA для Австралазии. На Лорд-Хау часы переводят на 30 минут, и в этой паре это происходит на 30 минут раньше по UTC, чем в Сиднее.
Смените пояс раннера, не меняя результат браузера
Запустите тот же файл, задав Перт как часовой пояс раннера Node:
TZ=Australia/Perth node australia-clock-check.mjs > results-perth.jsonСравните 12 объектов rows[].browser с results-utc.json. Они должны совпасть. Объекты runner должны различаться: запуск в UTC сообщает смещение 0, а Перт сообщает 480 минут к востоку от UTC. Раннером управляет переменная окружения TZ в Node.
Оба записанных запуска прошли все 12 строк с одинаковыми показаниями браузера. JSON-файлы целиком будут различаться, потому что в них сохраняются ещё и метки времени выполнения и метаданные раннера. Такое сравнение помогает заметить ожидаемое значение, случайно вычисленное в местном поясе раннера.
Убедитесь, что проверки отклоняют ошибку
В скрипте есть три намеренно неверных режима. Запускайте каждую команду отдельно, если ваша оболочка или задание CI останавливается после ненулевого кода выхода:
TZ=UTC node australia-clock-check.mjs one-nsw-clock > wrong-nsw.json
TZ=UTC node australia-clock-check.mjs one-hour-dst > wrong-dst.json
TZ=UTC node australia-clock-check.mjs omit-browser-timezone > wrong-browser-zone.json| Режим | Намеренная ошибка | Записанные непройденные строки |
|---|---|---|
one-nsw-clock | Ожидать для Брокен-Хилла и Лорд-Хау смещение Сиднея в тот же момент. | 5 из 12 |
one-hour-dst | Ожидать, что стандартное смещение Лорд-Хау +10:30 вырастет на целый час. | 2 из 12 |
omit-browser-timezone | Убрать настройку браузера, сохранив австралийские ожидания при раннере в UTC. | 12 из 12 |
Каждый режим должен завершаться с кодом 1. Первые два намеренно меняют ожидаемые значения; третий убирает настройку браузера. Они показывают, что именно эти ошибки обнаруживаются. В wrong-nsw.json пять непройденных идентификаторов относятся к Брокен-Хиллу в январе и июле, Лорд-Хау в июле и обоим пограничным снимкам Лорд-Хау. В wrong-dst.json Лорд-Хау в январе и снимок после перехода отклоняют выдуманное смещение +11:30.
При неожиданном сбое в обычном запуске посмотрите summary.failed и assertions этой строки:
| Непройденная проверка | Что смотреть дальше |
|---|---|
fixedInstant | Убедитесь, что вход UTC задан явно и что фиксированное время установлено до того, как страница прочитает часы. |
requestedTimezone | Убедитесь, что страница принадлежит контексту с запрошенным timezoneId. |
expectedOffset или expectedWallTime | Проверьте дату строки, пояс, знак смещения и действующие правила, прежде чем менять ожидание. |
renderedEqualsSampled | Изучите ошибки страницы и любую разницу между отрисованными часами и более поздним показанием браузера. |
Если все строки проходят, но summary.allPassed равно false, изучите ещё relationshipsMinutes, requests, blockedRequests и pageErrors. Фикстура требует заявленных соотношений смещений, ровно 12 запросов к своей loopback-странице и отсутствия заблокированных запросов страницы и ошибок страницы.
Примените эти настройки к своей странице
Выберите отображение даты или расписание, ожидаемое поведение которого вы можете сформулировать. Сохраните явный вход UTC и браузерный timezoneId, а проверку видимых часов фикстуры замените проверкой этого элемента в собственном тесте. Сам скачиваемый скрипт не принимает внешний целевой URL.
Для первого сравнения держите остальные входные данные постоянными: локаль, сохранённые настройки, конфигурацию приложения и тестовые данные. Если приложение намеренно форматирует расписание в фиксированном деловом поясе, проверяйте именно это поведение. Метке времени, сформированной сервером, или настройке часового пояса на уровне аккаунта нужна своя подготовка; одна лишь эмуляция в браузере не задаёт ни то, ни другое.
Начните с подходящей пары январь/июль, затем добавьте пограничный случай, который поддерживает ваше приложение. При разборе расхождения сохраняйте непройденный вход и запись об окружении из JSON. Если менять ожидаемый результат только ради совпадения с запуском браузера, независимая проверка исчезнет.
Если приложение ещё и принимает решение по местоположению IP-адреса запроса, используйте отдельный тест местоположения выхода. Страница выбора прокси для Австралии объясняет, как выбрать доказательства местоположения, которые нужны такому правилу.
Метод и ограничения
Записанные запуски использовали Node.js 24.20.0, Playwright 1.63.0 и Chromium 153.0.8010.12 на macOS arm64. После установки зависимостей каждый запуск сделал 12 запросов к собственной loopback-странице, без единой попытки страницы обратиться к другому источнику и без ошибок страницы. Ожидаемые смещения взяты из первичных источников выше; скрипт сравнивал отрисованные часы страницы со вторым показанием браузера.
Это охватывает один браузерный движок и одну ОС в 12 заявленных случаях. Отсюда не следуют выводы о ходе таймеров, о повторяющемся времени при переводе часов назад, обо всех территориях Австралии, о поведении вашего приложения или о географии австралийских IP-адресов. Проверялся источник IANA версии 2026d. Значение nodeTz: 2026a в результатах описывает данные о часовых поясах в Node; версия внутренней базы Chromium не измерялась. Сохраняйте сведения о версиях и перепроверяйте правила при обновлении или выборе новых дат.
Наличие австралийских прокси не подтверждено. Получите ранний доступ. Одно письмо, когда откроется доступ. Больше ничего.
Источники и дополнительное чтение
Технические материалы, использованные при подготовке руководства. Сверяйтесь с документацией вашей версии и с поддерживаемой конфигурацией вашего провайдера.