在 Playwright 中设置浏览器的 timezoneId,固定一个明确的 UTC 时刻,然后断言页面显示的日期。Node 运行器的时区要单独对待:修改浏览器设置并不会改变运行器。Playwright 在其区域设置和时区控制文档中说明了这一区别。
下面可下载的检查脚本提供 12 个可重复的澳大利亚用例:两个季节的悉尼和布里斯班、布罗肯希尔的半小时偏移,以及豪勋爵岛 30 分钟的夏令时调整。它在 127.0.0.1 上提供自己的小页面,读取 Chromium 中渲染出的时钟,并把断言保存为 JSON。不需要代理,也不需要凭据。
运行时钟检查
使用 Node.js 24。在 macOS 或 Linux 的 shell 中:
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() 返回的值,而定时器照常运行;这个测试夹具检查的是渲染出的日期。Playwright 的固定时间 API
在测试用例中保留澳大利亚的例外情况
这八行使用 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”不能被当作单一的时钟预期。新南威尔士州的时间定义与例外说明了这些偏移量,以及昆士兰州不实行夏令时。参考结果记录了这次 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 月的输入按照当天核对过的规则模拟未来的时刻;它们既没有记录一次真实的切换,也没有测试跨越切换运行的定时器。新南威尔士州的季节性日期和 IANA 的澳大拉西亚规则支持这些日期和偏移预期。豪勋爵岛的调整幅度是 30 分钟,并且在这一对中,它按 UTC 计算比悉尼的调整早 30 分钟发生。
更换运行器而不改变浏览器结果
把珀斯作为 Node 运行器的时区,运行同一个文件:
TZ=Australia/Perth node australia-clock-check.mjs > results-perth.json把 12 个 rows[].browser 对象与 results-utc.json 进行比较。它们应当一致。runner 对象应当不同:UTC 运行报告的偏移为 0,而珀斯报告为 UTC 以东 480 分钟。Node 的 TZ 环境变量控制运行器。
两次记录的运行都通过了全部 12 行,浏览器读数完全相同。完整的 JSON 文件会有差异,因为其中还保留了执行时间戳和运行器元数据。这种比较有助于发现不小心按运行器本地时区计算出来的测试预期。
确认断言能拒绝错误
脚本包含三种故意出错的模式。如果你的 shell 或 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 | 对布罗肯希尔和豪勋爵岛也预期同一时刻的悉尼偏移。 | 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 位置做出决定,请另外做一次出口位置测试。澳大利亚代理选择页面说明了如何选择该规则所需的位置证据。
方法与局限
记录的运行使用了 macOS arm64 上的 Node.js 24.20.0、Playwright 1.63.0 和 Chromium 153.0.8010.12。安装依赖之后,每次运行都向自己的环回页面发出 12 次请求,页面没有任何跨源请求尝试,也没有页面错误。预期偏移来自上面的一手来源;脚本把页面渲染出的时钟与浏览器的第二次读数进行了比较。
这只覆盖一个浏览器引擎和一个操作系统下的 12 个声明用例。它不能说明定时器的推进、时钟回拨时重复出现的时间、澳大利亚的每个领地、你的应用的行为,或澳大利亚 IP 的地理分布。核对过的 IANA 来源是版本 2026d。结果中的 nodeTz: 2026a 描述的是 Node 的时区数据;Chromium 内部数据库的版本没有测量。请保留版本信息,并在升级或选择新日期时重新核对规则。
澳大利亚代理的可用性尚未确认。获取早期访问。开放访问时发一封邮件。仅此而已。
参考来源与延伸阅读
本指南参考的技术资料。请以你所安装版本的文档以及代理服务商支持的配置为准。