public static String getTimeZoneName(String zoneID, Locale locale) {
        TimeZone zone = TimeZone.getTimeZone(zoneID);
        StringBuilder buf = new StringBuilder();
        // Add in the GMT part to the name. First, figure out the offset.
        Duration offset = Duration.ofMillis(zone.getRawOffset());
        if (zone.inDaylightTime(new Date()) && zone.useDaylightTime()) {
            offset = offset.plus(Duration.ofHours(1));
        }

        buf.append('(');
        if (offset.isNegative()) {
            buf.append("GMT-");
        }
        else {
            buf.append("GMT+");
        }
        offset = offset.abs();
        long hours = offset.toHours();
        long minutes = offset.minusHours(hours).toMinutes();
        buf.append(hours).append(':');
        if (minutes < 10) {
            buf.append('0').append(minutes);
        }
        else {
            buf.append(minutes);
        }
        buf.append(") ");

        // Use a friendly english timezone name if the locale is en, otherwise use the timezone id
        if ("en".equals(locale.getLanguage())) {
            String name = nameMap.get(zoneID);
            if (name == null) {
                name = zoneID;
            }

            buf.append(name);
        }
        else {
            buf.append(
                    zone.getDisplayName(true, TimeZone.LONG, locale).replace('_', ' ').replace('/',
                            ' '));
        }

        return buf.toString();
    }
Returns the display name for a time zone. The display name is the name
specified by the Java TimeZone class for non-"en" locales or a friendly english
name for "en", with the addition of the GMT offset
for human readability.

@param zoneID the time zone to get the name for.
@param locale the locale to use.
@return the display name for the time zone.
xmppserver/src/main/java/org/jivesoftware/util/LocaleUtils.java