`Intl.DateTimeFormat().resolvedOptions().timeZone` is `undefined` when `TZ` is a POSIX offset such as `UTC+3`
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 45/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- javascript, nodejs
调研方向
The bug is in V8's JSDateTimeFormat::TimeZoneId, which returns undefined when ICU cannot map a POSIX offset to a canonical ID. Start by examining src/objects/js-date-time-format.cc in the Node.js or V8 repository. Look for where icu::TimeZone::getCanonicalID is called and how it handles offset strings. Test with TZ=UTC+3 to reproduce, and check if the fix involves returning an offset string like "-03:00" as per ECMA-262. Run existing intl tests to ensure changes don't break other time zone handling.
由索引模型根据 Issue 内容生成。
描述
Version
v26.5.1 (V8 14.6.202.34-node.24, ICU 78.3). Also reproduces on v22.17.1, v24.11.0 and v25.4.0.
Platform
Linux 7.0.0-31-generic x86_64
Subsystem
intl
What steps will reproduce the bug?
$ TZ=UTC+3 node -p 'Intl.DateTimeFormat().resolvedOptions().timeZone'
undefined
$ TZ=UTC+3 node -p 'new Date().getTimezoneOffset()'
180
TZ=UTC-2 gives undefined as well, with an offset of -120. IANA names are unaffected (TZ=Europe/Paris gives "Europe/Paris", TZ=EST5EDT gives "America/New_York").
How often does it reproduce? Is there a required condition?
Always, when TZ is a POSIX offset string such as UTC+3 that ICU cannot map to a time zone ID.
What is the expected behavior? Why is that the expected behavior?
A string. ECMA-262 SystemTimeZoneIdentifier "returns a String", either a primary time zone identifier or an offset time zone identifier, so here "-03:00" (POSIX UTC+3 is three hours west of UTC, matching getTimezoneOffset() === 180). Formatting already knows the offset: new Intl.DateTimeFormat("en", { timeZoneName: "short" }).format(0) gives 12/31/1969, GMT-3.
What do you see instead?
undefined. Code that keys anything on the zone name (caches, logs, Intl.DateTimeFormat(undefined, { timeZone })) sees the same value for every such offset.
Additional information
The undefined comes from V8's JSDateTimeFormat::TimeZoneId, which returns undefined when icu::TimeZone::getCanonicalID fails, "when the time_zone is neither a known system time zone ID nor a valid custom time zone ID": https://github.com/v8/v8/blob/36de2a2334c9129db7f6fe0db76fd7d5fa64df78/src/objects/js-date-time-format.cc#L612-L635. So this may need forwarding to V8. For comparison, Bun 1.4.0 returns "UTC" in the same environment.
Related but different: #50301 (macOS Sonoma), #26880 (/etc/localtime symlink).
- 主要语言
- JavaScript
- 星标
- 122k
- 派生
- 37.4k
- 平均合并
- 4 天 4 小时
- 30 天内合并 PR
- 282
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
nodejs/node 的其他 Issue
-
doc
难度 2/5 1-3 小时 新手友好度 65/100
-
build
难度 1/5 1 小时以内 新手友好度 88/100
-
难度 2/5 1-3 小时 新手友好度 84/100
-
难度 1/5 1 小时以内 新手友好度 90/100
-
feature request
难度 2/5 1-3 小时 新手友好度 68/100
相似的 Issue
-
难度 1/5 1-3 小时 新手友好度 78/100
Mintplex-Labs/anything-llm#6490 ·
-
难度 2/5 1-3 小时 新手友好度 86/100
-
[quality] workflow-scripts guard reads test:unit:coverage as skipping the unit suite, blocking #632 未关闭agent/quality hive/hosted-available-lke648397-260827-5n31 quality testing
难度 2/5 1-3 小时 新手友好度 86/100
-
难度 2/5 1-3 小时 新手友好度 72/100
-
area-clientside-dartpad
难度 2/5 1-3 小时 新手友好度 62/100