# 在 Playwright 中测试澳大利亚时区

Source: https://ipvolt.com/zh/guides/playwright-australia-timezones
Markdown: https://ipvolt.com/zh/guides/playwright-australia-timezones.md
Language: zh-CN

[ipvolt 首页](https://ipvolt.com/zh.md) / [指南](https://ipvolt.com/zh/guides.md) / 在 Playwright 中测试澳大利亚时区

集成
审校于: 2026-09-27
阅读约 6 分钟
作者： ipvolt

在 Playwright 中运行 12 项澳大利亚浏览器时钟检查，包括豪勋爵岛的 30 分钟夏令时调整。把固定的 UTC 输入、浏览器时区和 Node 运行器的时区分开验证。

在 Playwright 中设置浏览器的 `timezoneId`，固定一个明确的 UTC 时刻，然后断言页面显示的日期。Node 运行器的时区要单独对待：修改浏览器设置并不会改变运行器。Playwright 在其[区域设置和时区控制](https://playwright.dev/docs/emulation#locale--timezone)文档中说明了这一区别。

下面可下载的检查脚本提供 12 个可重复的澳大利亚用例：两个季节的悉尼和布里斯班、布罗肯希尔的半小时偏移，以及豪勋爵岛 30 分钟的夏令时调整。它在 `127.0.0.1` 上提供自己的小页面，读取 Chromium 中渲染出的时钟，并把断言保存为 JSON。不需要代理，也不需要凭据。

## 运行时钟检查

使用 Node.js 24。在 macOS 或 Linux 的 shell 中：

```sh
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
```

[脚本](/downloads/australia-clock-check.mjs)和 [README](/downloads/australia-clock-README.md) 可以直接下载。把你的输出与[参考 JSON](/downloads/australia-clock-results.json)（包含全部断言和环境信息）或[参考 CSV](/downloads/australia-clock-results.csv)（包含选定的行字段）进行比较。

运行成功时以 `0` 退出，并报告 `summary.allPassed: true`，以及 `total: 12` 和 `passed: 12`。其中包括预期的时钟关系以及请求和错误检查。以 `1` 退出并输出结果 JSON，表示有断言失败。标准错误中出现启动或依赖错误属于环境配置失败；如果 Chromium 在 Linux 上无法启动，请检查 Playwright 的[浏览器系统依赖](https://playwright.dev/docs/browsers#install-system-dependencies)。

对于每一行，脚本都会新建一个浏览器上下文，设置它的 `timezoneId`，并在加载页面之前调用 `page.clock.setFixedTime(new Date(test.utc))`。UTC 输入以 `Z` 结尾，因此无论运行器处于哪种环境，它指的都是同一时刻。`setFixedTime` 会固定 `Date.now()` 和 `new Date()` 返回的值，而定时器照常运行；这个测试夹具检查的是渲染出的日期。[Playwright 的固定时间 API](https://playwright.dev/docs/api/class-clock#clock-set-fixed-time)

## 在测试用例中保留澳大利亚的例外情况

这八行使用 **2026 年 1 月 15 日**和 **2026 年 7 月 15 日**的 UTC 午夜。下面的偏移量均为 UTC 以东。JSON 以分钟表示它们，符号与 JavaScript 的 `getTimezoneOffset()` 相反。

| 浏览器 `timezoneId` | 1 月当地时间 / UTC 偏移 | 7 月当地时间 / 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 |

悉尼和布里斯班在 7 月一致，但在 1 月相差一小时。布罗肯希尔和豪勋爵岛也说明“NSW”不能被当作单一的时钟预期。新南威尔士州的[时间定义与例外](https://dcj.nsw.gov.au/about-us/daylight-saving/definitions-of-time-and-how-time-is-regulated.html)说明了这些偏移量，以及昆士兰州不实行夏令时。[参考结果](/downloads/australia-clock-results.json)记录了这次 Chromium 运行在所声明时刻渲染出的内容。

其余四行覆盖模拟的 **2026 年 10 月 4 日**调整前后。每一对的 UTC 相差一秒：

| 浏览器时区 | 2026 年 10 月 3 日的 UTC 快照 | 2026 年 10 月 4 日的当地快照 | 偏移变化 |
| --- | --- | --- | --- |
| `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 |

这些是**合成的固定时间快照**，执行于 2026 年 9 月 26 日（UTC）。10 月的输入按照当天核对过的规则模拟未来的时刻；它们既没有记录一次真实的切换，也没有测试跨越切换运行的定时器。[新南威尔士州的季节性日期](https://www.nsw.gov.au/about-nsw/daylight-saving)和 [IANA 的澳大拉西亚规则](https://data.iana.org/time-zones/tzdb/australasia)支持这些日期和偏移预期。豪勋爵岛的调整幅度是 30 分钟，并且在这一对中，它按 UTC 计算比悉尼的调整早 30 分钟发生。

## 更换运行器而不改变浏览器结果

把珀斯作为 Node 运行器的时区，运行同一个文件：

```sh
TZ=Australia/Perth node australia-clock-check.mjs > results-perth.json
```

把 12 个 `rows[].browser` 对象与 `results-utc.json` 进行比较。它们应当一致。`runner` 对象应当不同：UTC 运行报告的偏移为 `0`，而珀斯报告为 UTC 以东 `480` 分钟。Node 的 [`TZ` 环境变量](https://nodejs.org/docs/latest-v24.x/api/cli.html#tz)控制运行器。

两次记录的运行都通过了全部 12 行，浏览器读数完全相同。完整的 JSON 文件会有差异，因为其中还保留了执行时间戳和运行器元数据。这种比较有助于发现不小心按运行器本地时区计算出来的测试预期。

## 确认断言能拒绝错误

脚本包含三种故意出错的模式。如果你的 shell 或 CI 作业会在非零退出后停止，请分别运行每条命令：

```sh
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` | 对布罗肯希尔和豪勋爵岛也预期同一时刻的悉尼偏移。 | 12 行中的 5 行 |
| `one-hour-dst` | 预期豪勋爵岛 +10:30 的标准偏移增加整整一小时。 | 12 行中的 2 行 |
| `omit-browser-timezone` | 去掉浏览器设置，同时在 UTC 运行器下保留澳大利亚的预期。 | 12 行中的 12 行 |

每种模式都应以 `1` 退出。前两种故意修改了预期值；第三种去掉了一项浏览器控制。它们证明这些特定错误能够被检测到。在 `wrong-nsw.json` 中，失败的五个 ID 是 1 月和 7 月的布罗肯希尔、7 月的豪勋爵岛，以及豪勋爵岛的两个边界快照。在 `wrong-dst.json` 中，1 月的豪勋爵岛和调整后的快照拒绝了虚构的 +11:30 偏移。

如果正常运行中出现意外失败，请查看 `summary.failed` 和该行的 `assertions`：

| 失败的检查 | 接下来检查什么 |
| --- | --- |
| `fixedInstant` | 确认使用了明确的 UTC 输入，并且固定时间是在页面读取时钟之前设置的。 |
| `requestedTimezone` | 确认页面属于设置了所请求 `timezoneId` 的上下文。 |
| `expectedOffset` 或 `expectedWallTime` | 在修改预期之前，先检查该行的日期、时区、偏移符号和现行规则。 |
| `renderedEqualsSampled` | 检查页面错误，以及渲染出的时钟与之后的浏览器读数之间的任何差异。 |

如果每一行都通过，但 `summary.allPassed` 为 false，还要检查 `relationshipsMinutes`、`requests`、`blockedRequests` 和 `pageErrors`。该夹具要求满足所声明的偏移关系、对其环回页面恰好发出 12 次请求，并且没有被拦截的页面请求或页面错误。

## 把这些控制用到你自己的页面上

选择一个你能说明预期行为的日期显示或日程。保留明确的 UTC 输入和浏览器 `timezoneId`，然后在你自己的测试中，用针对该元素的断言替换夹具中对可见时钟的断言。下载的脚本本身不接受外部目标 URL。

第一次比较时保持其他输入不变：区域设置、已保存的偏好、应用配置和测试数据。如果应用有意按固定的业务时区格式化日程，就断言这一行为。服务器生成的时间戳或账户级的时区偏好需要各自的准备工作；仅靠浏览器模拟无法确定其中任何一个值。

先从相关的 1 月/7 月组合开始，再添加一个你的应用支持的边界用例。排查差异时，保留失败的输入和 JSON 中的环境记录。仅仅为了与某次浏览器运行一致而修改预期输出，会让这项独立检查失去意义。

如果应用还会根据请求的 IP 位置做出决定，请另外做一次出口位置测试。[澳大利亚代理选择页面](/zh/proxies/australia)说明了如何选择该规则所需的位置证据。

## 方法与局限

记录的运行使用了 macOS arm64 上的 Node.js **24.20.0**、Playwright **1.63.0** 和 Chromium **153.0.8010.12**。安装依赖之后，每次运行都向自己的环回页面发出 12 次请求，页面没有任何跨源请求尝试，也没有页面错误。预期偏移来自上面的一手来源；脚本把页面渲染出的时钟与浏览器的第二次读数进行了比较。

这只覆盖一个浏览器引擎和一个操作系统下的 12 个声明用例。它不能说明定时器的推进、时钟回拨时重复出现的时间、澳大利亚的每个领地、你的应用的行为，或澳大利亚 IP 的地理分布。核对过的 IANA 来源是[版本 **2026d**](https://data.iana.org/time-zones/tzdb/version)。结果中的 `nodeTz: 2026a` 描述的是 Node 的时区数据；Chromium 内部数据库的版本没有测量。请保留版本信息，并在升级或选择新日期时重新核对规则。

澳大利亚代理的可用性尚未确认。[获取早期访问](/zh/proxies#waitlist-closing)。开放访问时发一封邮件。仅此而已。

## 参考来源与延伸阅读

- [Browser locale and timezone; separate runner](https://playwright.dev/docs/emulation#locale--timezone)
- [Clock setFixedTime API](https://playwright.dev/docs/api/class-clock#clock-set-fixed-time)
- [Browser installation and system dependencies](https://playwright.dev/docs/browsers#install-system-dependencies)
- [Time definitions and NSW exceptions](https://dcj.nsw.gov.au/about-us/daylight-saving/definitions-of-time-and-how-time-is-regulated.html)
- [Current daylight-saving dates](https://www.nsw.gov.au/about-nsw/daylight-saving)
- [Australasian zone rules](https://data.iana.org/time-zones/tzdb/australasia)
- [Live directory version](https://data.iana.org/time-zones/tzdb/version)
- [Node.js TZ environment variable](https://nodejs.org/docs/latest-v24.x/api/cli.html#tz)

## 相关指南

- [澳大利亚代理：国家、移动网络与 nbn 核查](https://ipvolt.com/zh/guides/australia-proxies.md)
- [在 Playwright 中配置代理](https://ipvolt.com/zh/guides/playwright-proxy-setup.md)
- [轮换代理与粘性代理：为会话连续性做好规划](https://ipvolt.com/zh/guides/rotating-vs-sticky-proxies.md)

## 关于 ipvolt

示例使用通用的代理设置，并附上原始技术文档链接。具体产品的行为请向你的服务商确认。ipvolt 仍在开发中。

[阅读英文原文](https://ipvolt.com/guides/playwright-australia-timezones.md)

## 了解何时开放体验。

ipvolt · 开发中

我们正在为开发者和数据团队打造代理基础设施。加入意向名单，ipvolt 就绪时第一时间收到通知。

开放体验时仅发一封通知邮件，不发送其他邮件。

[申请抢先体验](https://ipvolt.com/zh/guides/playwright-australia-timezones#waitlist-closing)

[隐私政策](https://ipvolt.com/privacy)

