diff --git a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java index 55dd6a8d6ad..ab878a4d2a5 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/CLDRConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -293,8 +293,10 @@ public class CLDRConverter { bundleGenerator = new ResourceBundleGenerator(); // Parse data independent of locales - parseSupplemental(); + // parseBCP47() must precede parseSupplemental(). The latter depends + // on IANA alias map, which is produced by the former. parseBCP47(); + parseSupplemental(); // rules maps pluralRules = generateRules(handlerPlurals); @@ -536,6 +538,12 @@ public class CLDRConverter { // canonical tz name map // alias -> primary + // + // Note that CLDR meta zones do not necessarily align with IANA's + // current time zone identifiers. For example, the CLDR "India" + // meta zone maps to "Asia/Calcutta", whereas IANA now uses + // "Asia/Kolkata" for the zone. Accordingly, "canonical" here is + // defined in terms of CLDR's zone mappings. handlerTimeZone.getData().forEach((k, v) -> { String[] ids = ((String)v).split("\\s"); for (int i = 1; i < ids.length; i++) { diff --git a/make/jdk/src/classes/build/tools/cldrconverter/TimeZoneParseHandler.java b/make/jdk/src/classes/build/tools/cldrconverter/TimeZoneParseHandler.java index 66e94e5ca06..8203a9f0b91 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/TimeZoneParseHandler.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/TimeZoneParseHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,9 @@ package build.tools.cldrconverter; import java.io.File; import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import org.xml.sax.Attributes; import org.xml.sax.InputSource; @@ -40,6 +43,10 @@ import org.xml.sax.SAXException; class TimeZoneParseHandler extends AbstractLDMLHandler { private static final String PREF_PREFIX = "preferred:"; + // CLDR aliases to IANA ids map. The initial capacity is estimated + // from the number of aliases in timezone.xml as of CLDR v48 + private final Map ianaAliasMap = HashMap.newHashMap(32); + @Override public InputSource resolveEntity(String publicID, String systemID) throws IOException, SAXException { // avoid HTTP traffic to unicode.org @@ -61,7 +68,16 @@ class TimeZoneParseHandler extends AbstractLDMLHandler { put(attributes.getValue("name"), PREF_PREFIX + preferred); } } else { - put(attributes.getValue("name"), attributes.getValue("alias")); + var alias = attributes.getValue("alias"); + var iana = attributes.getValue("iana"); + if (iana != null) { + for (var a : alias.split("\\s+")) { + if (!a.equals(iana)) { + ianaAliasMap.put(a, iana); + } + } + } + put(attributes.getValue("name"), alias); } } break; @@ -80,4 +96,8 @@ class TimeZoneParseHandler extends AbstractLDMLHandler { .forEach(e -> map.put(e.getKey(), map.get(e.getValue().toString().substring(PREF_PREFIX.length())))); } + + Map getIanaAliasMap() { + return ianaAliasMap; + } } diff --git a/make/jdk/src/classes/build/tools/cldrconverter/WinZonesParseHandler.java b/make/jdk/src/classes/build/tools/cldrconverter/WinZonesParseHandler.java index a584358f0cb..343e143b6ad 100644 --- a/make/jdk/src/classes/build/tools/cldrconverter/WinZonesParseHandler.java +++ b/make/jdk/src/classes/build/tools/cldrconverter/WinZonesParseHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,6 +56,7 @@ class WinZonesParseHandler extends AbstractLDMLHandler { String zoneName = attributes.getValue("other"); String territory = attributes.getValue("territory"); String javatz = attributes.getValue("type").replaceFirst("\\s.*", ""); + javatz = CLDRConverter.handlerTimeZone.getIanaAliasMap().getOrDefault(javatz, javatz); put(zoneName + ":" + territory, javatz); pushIgnoredContainer(qName); break;