`Intl.DateTimeFormat().resolvedOptions().timeZone` is `undefined` when `TZ` is a POSIX offset such as `UTC+3`
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 45/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- javascript, nodejs
- Domaine
- backend, internationalization
Piste de recherche
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.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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).
- Langage dominant
- JavaScript
- Étoiles
- 122k
- Forks
- 37.4k
- Merge moyen
- 4 j 2 h
- PR mergées (30 j)
- 277
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de nodejs/node
-
doc
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
-
build
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
-
feature request
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Toutes les issues de nodejs/node
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
mksglu/context-mode#1200 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
neondatabase/website#5944 ·
-
module: core
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
bigbluebutton/bigbluebutton#25849 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
jaegertracing/jaeger-ui#4506 ·