From 13171d151a4f05be80c4edee386fd856f6f0b96a Mon Sep 17 00:00:00 2001 From: Naoto Sato Date: Mon, 11 May 2026 15:45:11 +0000 Subject: [PATCH] 8384043: [REDO] Incorrect handling of Hawaii_Aleutian metazone Reviewed-by: jlu --- .../tools/cldrconverter/CLDRConverter.java | 40 ++++++++++--------- .../resources/cldr/TimeZoneNamesTest.java | 23 ++++++++++- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java index 18ce0c334fb..7b198f97679 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java @@ -815,6 +815,13 @@ public class CLDRConverter { data = map.get(TIMEZONE_ID_PREFIX + tzLink); } + String meta = handlerMetaZones.get(tzKey); + if (meta == null && tzLink != null) { + // Check for tzLink + meta = handlerMetaZones.get(tzLink); + } + String metaKey = meta != null ? METAZONE_ID_PREFIX + meta : null; + if (data instanceof String[] tznames) { // Hack for UTC. UTC is an alias to Etc/UTC in CLDR if (tzid.equals("Etc/UTC") && !map.containsKey(TIMEZONE_ID_PREFIX + "UTC")) { @@ -826,24 +833,14 @@ public class CLDRConverter { tznames = Arrays.copyOf(tznames, tznames.length); fillTZDBShortNames(tzKey, tznames); names.put(tzid, tznames); + if (meta != null && map.get(metaKey) instanceof String[] metaNames) { + recordMetazone(names, meta, tzKey, metaNames); + } } } else { - String meta = handlerMetaZones.get(tzKey); - if (meta == null && tzLink != null) { - // Check for tzLink - meta = handlerMetaZones.get(tzLink); - } if (meta != null) { - String metaKey = METAZONE_ID_PREFIX + meta; - data = map.get(metaKey); - if (data instanceof String[] tznames) { - if (isDefaultZone(meta, tzKey)) { - // Record the metazone names only from the default - // (001) zone, with short names filled from TZDB - tznames = Arrays.copyOf(tznames, tznames.length); - fillTZDBShortNames(tzKey, tznames); - names.put(metaKey, tznames); - } + if (map.get(metaKey) instanceof String[] metaNames) { + recordMetazone(names, meta, tzKey, metaNames); names.put(tzid, meta); if (tzLink != null && availableIds.contains(tzLink)) { names.put(tzLink, meta); @@ -1508,11 +1505,18 @@ public class CLDRConverter { } } - private static boolean isDefaultZone(String meta, String tzid) { + private static void recordMetazone(Map names, String meta, String tzid, String[] tznames) { String zone001 = handlerMetaZones.zidMap().get(meta); var tzLink = getTZDBLink(tzid); - return canonicalTZMap.getOrDefault(tzid, tzid).equals(zone001) || - tzLink != null && canonicalTZMap.getOrDefault(tzLink, tzLink).equals(zone001); + + // Record the metazone names only from the default + // (001) zone, with short names filled from TZDB + if (canonicalTZMap.getOrDefault(tzid, tzid).equals(zone001) || + tzLink != null && canonicalTZMap.getOrDefault(tzLink, tzLink).equals(zone001)) { + tznames = Arrays.copyOf(tznames, tznames.length); + fillTZDBShortNames(tzid, tznames); + names.put(METAZONE_ID_PREFIX + meta, tznames); + } } private static String getTZDBLink(String tzid) { diff --git a/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java b/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java index b02f988e7c0..68f6c8a401b 100644 --- a/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java +++ b/test/jdk/sun/util/resources/cldr/TimeZoneNamesTest.java @@ -24,7 +24,7 @@ /* * @test * @bug 8181157 8202537 8234347 8236548 8261279 8322647 8174269 8346948 - * 8354548 8381379 8382020 + * 8354548 8381379 8382020 8384043 * @modules jdk.localedata * @summary Checks CLDR time zone names are generated correctly at * either build or runtime @@ -274,6 +274,27 @@ public class TimeZoneNamesTest { "EDT", "Восточная Америка", "ET"}, + + // Hawaii/Aleutian + // + // Note that CLDR v48 only contains the standard names in "Hawaii" + // metazone. Other long names are synthesized, and short names are + // from TZDB. "America/Adak" reflects the "Hawaii_Aleutian" metazone + // names. + {"Pacific/Honolulu", Locale.US, + "Hawaii-Aleutian Standard Time", + "HST", + "Honolulu Daylight Time", + "HST", + "Honolulu Time", + "HST"}, + {"America/Adak", Locale.US, + "Hawaii-Aleutian Standard Time", + "HAST", + "Hawaii-Aleutian Daylight Time", + "HADT", + "Hawaii-Aleutian Time", + "HAT"}, }; }