Hi Dmytro - The IANA Time Zone Database
switched to use Europe/Kyiv in Release Release 2022b in August 2022. The deprecated name for this time zone, Europe/Kiev, remains in TZDB only as a
Link to the new name.
However, as you've observed, changes in TZDB are sometimes slow to arrive in different OSs and programming platforms. In particular, many platforms consume TZDB indirectly via the Unicode ICU native library, which in turn uses data in
Unicode CLDR to determine which IANA time zone identifiers are valid. Specifically, they typically use the
TimeZone::getCanonicalID in C++ (or its Java equivalent) to resolve deprecated IDs (like Asia/Ulan_Bator) to their corresponding primary ID like Asia/Ulaanbaatar. This ICU API always returns the first ID listed in CLDR. For example, see the line below from the
latest CLDR timezone.xml:
<type name="mnuln" description="Ulaanbaatar (Ulan Bator), Mongolia" alias="Asia/Ulaanbaatar Asia/Ulan_Bator"/>
ICU and CLDR, for sensible reasons to avoid breaking existing applications, never change the ID returned by
TimeZone::getCanonicalID. So even though some deprecations happened long ago in TZDB, like Asia/Calcutta => Asia/Kolkata, ICU still reports the old ID (like Asia/Calcutta) in
TimeZone::getCanonicalID because CLDR lists it first in the list:
<type name="inccu" description="Kolkata, India" alias="Asia/Calcutta Asia/Kolkata" iana="Asia/Kolkata"/>
You'll notice that this line has an
iana attribute, which (as you'd guess from its name) communicates the ID that is the current ID in TZDB, even if Asia/Calcutta is still first in the list of IDs in the
alias attribute. This
iana attribute is new, introduced in
CLDR 44 that was only released a few weeks ago. This new attribute powers the new
ICU TimeZone::getIanaID API which was released in
ICU 74.1 (see
this JIRA ticket) which was also released a few weeks ago on 31-10-2023. This new API finally provides the ability for ICU client apps (like Google Chrome, Apple Safari, and Node.js) to be able to return the most up-to-date IANA IDs.
As you'd expect, the same iana attribute has been
added for Kyiv's time zone:
<type name="uaiev" description="Kyiv, Ukraine" alias="Europe/Kiev Europe/Kyiv Europe/Zaporozhye Europe/Uzhgorod" iana="Europe/Kyiv"/>
As soon as ICU clients switch over to use the new
TimeZone::getIanaID API, you will see Europe/Kyiv being returned as you'd expect.
That said, I'm not sure when Chrome and Safari (or, more specifically, their ECMAScript engines V8 and JavaScriptCore) will switch over to the new API. But I'd expect it to happen sometime in 2024.
Thanks for asking about this important issue!
Justin Grant
(I'm part of the team defining ECMAScript's
Temporal date/time API and I've been working with CLDR and ICU to fix this problem you reported)