技术博客
Claude 时区检测完整指南:从 API 原理到环境信号关系
时区是最强的客户端地区信号之一。本文从技术角度全面解析浏览器时区检测的原理,以及 Claude Code 如何利用时区信息进行地区判断。
时区检测为什么重要
在所有浏览器可读的地区信号中,时区的权重最高(25 分,满分 100)。这不是随机决定的——时区信号具有几个独特的特点:它是操作系统级设置,安装后很少被修改;它直接反映用户的地理位置选择;它难以通过简单的 JavaScript 操作来伪造。
更重要的是,Claude Code 等终端工具可以直接读取系统时区,这使得时区信号在终端环境中也同样有效。这意味着无论用户是在浏览器中还是在终端中使用 AI 工具,时区信号都可能被检测到。
两个核心 API
IANA 时区名称:Intl.DateTimeFormat().resolvedOptions().timeZone 返回标准化的时区名称。例如,中国大部分地区返回 Asia/Shanghai,香港返回 Asia/Hong_Kong,台湾返回 Asia/Taipei。
这个 API 的优势在于它返回的是语义化的名称,而不是简单的偏移值。两个偏移值相同的时区可能有不同的 IANA 名称(例如 Asia/Shanghai 和 Asia/Chongqing 都是 UTC+8),ClaudeSignal 通过 sameZoneFamily 函数处理这种模糊匹配。
UTC 偏移:new Date().getTimezoneOffset() 返回当前时间与 UTC 的分钟差。北京时间返回 -480(UTC+8),纽约时间返回 300(UTC-5 冬季)或 240(UTC-4 夏季)。
偏移值的优势在于它是一个精确的数字,不依赖于 IANA 时区数据库的版本。ClaudeSignal 同时使用这两个 API 进行交叉验证。
夏令时对检测的影响
许多地区实行夏令时(DST),在夏季将时钟拨快一小时。这意味着同一个时区在不同月份可能产生不同的偏移值。
例如,美国东部时区在冬季是 UTC-5(偏移 300),在夏季是 UTC-4(偏移 240)。如果 ClaudeSignal 在 7 月份检测到 America/New_York 时区但偏移值是 300(冬季值),这可能表明浏览器环境被人为修改过。
中国的时区没有夏令时,所以 Asia/Shanghai 的偏移值始终是 -480。这使中国时区信号非常稳定,不容易出现季节性波动,也更难通过单独调整偏移值来改变整体画像。
ClaudeSignal 的检测逻辑会检查偏移值与 IANA 名称的一致性。如果不一致,会在报告中标记出来。
Claude Code 中的时区信号
根据公开的逆向分析,Claude Code 在通过 ANTHROPIC_BASE_URL 连接端点时,会读取操作系统的时区信息。Claude Code 运行在终端环境中,可以直接访问系统级的时区设置。
在 macOS 上,系统时区存储在 /etc/localtime 符号链接中。在 Linux 上,通过 /etc/timezone 或 TZ 环境变量设置。在 Windows 上,通过注册表中的时区键存储。
Claude Code 读取的是这个系统级的时区信息,而不是浏览器 JavaScript 可以读取的信息。但关键信号是一致的:ClaudeSignal 的网页检测使用相同的 Intl.DateTimeFormat API,因此检测到的时区在大多数情况下与 Claude Code 看到的相同。
修改时区的局限性
用户可以通过 Chrome flags 修改浏览器报告的时区。但这种方法有几个严重的局限:
只影响浏览器:Chrome flags 修改的是浏览器层,不会改变操作系统级的时区设置。Claude Code 读取的是系统时区,Chrome flags 对它完全无效。
破坏一致性:修改时区后,日期格式、数字格式、键盘布局等其他信号可能与新时区不一致。例如,将时区改为 America/New_York 但日期格式仍然是 YMD(中国格式),这种不一致本身就是可疑的。
不全面:即使在浏览器中修改了时区,字体、GPU、屏幕 DPI、Emoji 渲染等信号仍然不变。只修改时区无法消除所有地区暴露点。
实际检测示例
以下是一些典型场景的时区检测结果:
标准中国环境:时区 Asia/Shanghai,偏移 -480,命中。这是最常见的中国用户场景。
使用 VPN 的中国用户:时区 Asia/Shanghai,偏移 -480,命中。VPN 改变了 IP 但不改变时区。
修改了 Chrome flags 的用户:时区 America/New_York,偏移 300,不命中中国时区。但字体和语言信号仍然可能命中。
Docker 容器:时区 UTC,偏移 0,不命中任何特定地区。容器默认使用 UTC 时区。
使用 ClaudeSignal 检测器 可以查看你自己的时区检测结果。