8384043: [REDO] Incorrect handling of Hawaii_Aleutian metazone

Reviewed-by: jlu
This commit is contained in:
Naoto Sato 2026-05-11 15:45:11 +00:00
parent 1625a8ba4b
commit 13171d151a
2 changed files with 44 additions and 19 deletions

View File

@ -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<String, Object> 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) {

View File

@ -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"},
};
}