code: public String getDisplayName(boolean daylightTime, int style, Locale locale) {
          if (style != SHORT && style != LONG) {
              throw new IllegalArgumentException("Illegal style: " + style);
          }
  
          String[][] zoneStrings = TimeZoneNames.getZoneStrings(locale);
          String result = TimeZoneNames.getDisplayName(zoneStrings, getID(), daylightTime, style);
          if (result != null) {
              return result;
          }
  
          // If we get here, it's because icu4c has nothing for us. Most commonly, this is in the
          // case of short names. For Pacific/Fiji, for example, icu4c has nothing better to offer
          // than "GMT+12:00". Why do we re-do this work ourselves? Because we have up-to-date
          // time zone transition data, which icu4c _doesn't_ use --- it uses its own baked-in copy,
          // which only gets updated when we update icu4c. http://b/7955614 and http://b/8026776.
  
          // TODO: should we generate these once, in TimeZoneNames.getDisplayName? Revisit when we
          // upgrade to icu4c 50 and rewrite the underlying native code. See also the
          // "element[j] != null" check in SimpleDateFormat.parseTimeZone, and the extra work in
          // DateFormatSymbols.getZoneStrings.
          int offsetMillis = getRawOffset();
          if (daylightTime) {
              offsetMillis += getDSTSavings();
          }
          return createGmtOffsetString(true /* includeGmt */, true /* includeMinuteSeparator */,
                  offsetMillis);
      }
docs: Returns the {@link #SHORT short} or {@link #LONG long} name of this time
  zone with either standard or daylight time, as written in {@code locale}.
  If the name is not available, the result is in the format
  {@code GMT[+-]hh:mm}.
  
  @param daylightTime true for daylight time, false for standard time.
  @param style either {@link TimeZone#LONG} or {@link TimeZone#SHORT}.
  @param locale the display locale.