src/share/classes/java/util/Calendar.java

Print this page

        

*** 51,63 **** import java.security.ProtectionDomain; import java.text.DateFormat; import java.text.DateFormatSymbols; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; - import java.util.spi.CalendarDataProvider; import sun.util.BuddhistCalendar; - import sun.util.locale.provider.LocaleProviderAdapter; import sun.util.calendar.ZoneInfo; import sun.util.locale.provider.CalendarDataUtility; /** * The <code>Calendar</code> class is an abstract class that provides methods --- 51,61 ----
*** 744,753 **** --- 742,777 ---- public static final int LONG = 2; /** * A style specifier for {@link #getDisplayName(int, int, Locale) * getDisplayName} and {@link #getDisplayNames(int, int, Locale) + * getDisplayNames} indicating a narrow name used for format. Narrow names + * are typically single character strings, such as "M" for Monday. + * + * @see #NARROW_STANDALONE + * @see #SHORT_FORMAT + * @see #LONG_FOTMAT + * @since 1.8 + */ + public static final int NARROW_FORMAT = 4; + + /** + * A style specifier for {@link #getDisplayName(int, int, Locale) + * getDisplayName} and {@link #getDisplayNames(int, int, Locale) + * getDisplayNames} indicating a narrow name independently. Narrow names + * are typically single character strings, such as "M" for Monday. + * + * @see #NARROW_FORMAT + * @see #SHORT_STANDALONE + * @see #LONG_STANDALONE + * @since 1.8 + */ + public static final int NARROW_STANDALONE = NARROW_FORMAT | STANDALONE_MASK; + + /** + * A style specifier for {@link #getDisplayName(int, int, Locale) + * getDisplayName} and {@link #getDisplayNames(int, int, Locale) * getDisplayNames} indicating a short name used for format. * * @see #SHORT_STANDALONE * @see #LONG_FORMAT * @see #LONG_STANDALONE
*** 1470,1503 **** * the calendar field for which the string representation * is returned * @param style * the style applied to the string representation; one of {@link * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, ! * {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}. * @param locale * the locale for the string representation * (any calendar types specified by {@code locale} are ignored) * @return the string representation of the given ! * <code>field</code> in the given <code>style</code>, or ! * <code>null</code> if no string representation is * applicable. * @exception IllegalArgumentException ! * if <code>field</code> or <code>style</code> is invalid, ! * or if this <code>Calendar</code> is non-lenient and any * of the calendar fields have invalid values * @exception NullPointerException ! * if <code>locale</code> is null * @since 1.6 */ public String getDisplayName(int field, int style, Locale locale) { ! if (!checkDisplayNameParams(field, style, SHORT, LONG, locale, ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } ! // the standalone styles are supported only through CalendarDataProviders. ! if (isStandaloneStyle(style)) { return CalendarDataUtility.retrieveFieldValueName(getCalendarType(), field, get(field), style, locale); } --- 1494,1528 ---- * the calendar field for which the string representation * is returned * @param style * the style applied to the string representation; one of {@link * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, ! * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE}, ! * {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE}. * @param locale * the locale for the string representation * (any calendar types specified by {@code locale} are ignored) * @return the string representation of the given ! * {@code field} in the given {@code style}, or ! * {@code null} if no string representation is * applicable. * @exception IllegalArgumentException ! * if {@code field} or {@code style} is invalid, ! * or if this {@code Calendar} is non-lenient and any * of the calendar fields have invalid values * @exception NullPointerException ! * if {@code locale} is null * @since 1.6 */ public String getDisplayName(int field, int style, Locale locale) { ! if (!checkDisplayNameParams(field, style, SHORT, NARROW_FORMAT, locale, ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } ! // the standalone and narrow styles are supported only through CalendarDataProviders. ! if (isStandaloneStyle(style) || isNarrowStyle(style)) { return CalendarDataUtility.retrieveFieldValueName(getCalendarType(), field, get(field), style, locale); }
*** 1511,1572 **** } return null; } /** ! * Returns a <code>Map</code> containing all names of the calendar ! * <code>field</code> in the given <code>style</code> and ! * <code>locale</code> and their corresponding field values. For ! * example, if this <code>Calendar</code> is a {@link * GregorianCalendar}, the returned map would contain "Jan" to * {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the * {@linkplain #SHORT short} style in an English locale. * * <p>The values of other calendar fields may be taken into * account to determine a set of display names. For example, if ! * this <code>Calendar</code> is a lunisolar calendar system and * the year value given by the {@link #YEAR} field has a leap * month, this method would return month names containing the leap * month name, and month names are mapped to their values specific * for the year. * * <p>The default implementation supports display names contained in ! * a {@link DateFormatSymbols}. For example, if <code>field</code> ! * is {@link #MONTH} and <code>style</code> is {@link ! * #ALL_STYLES}, this method returns a <code>Map</code> containing * all strings returned by {@link DateFormatSymbols#getShortMonths()} * and {@link DateFormatSymbols#getMonths()}. * * @param field * the calendar field for which the display names are returned * @param style * the style applied to the string representation; one of {@link * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, ! * {@link #LONG_FORMAT} ({@link #LONG}) or {@link #LONG_STANDALONE}. * @param locale * the locale for the display names ! * @return a <code>Map</code> containing all display names in ! * <code>style</code> and <code>locale</code> and their ! * field values, or <code>null</code> if no display names ! * are defined for <code>field</code> * @exception IllegalArgumentException ! * if <code>field</code> or <code>style</code> is invalid, ! * or if this <code>Calendar</code> is non-lenient and any * of the calendar fields have invalid values * @exception NullPointerException ! * if <code>locale</code> is null * @since 1.6 */ public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) { ! if (!checkDisplayNameParams(field, style, ALL_STYLES, LONG, locale, ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } if (style == ALL_STYLES || isStandaloneStyle(style)) { return CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale); } ! // SHORT or LONG return getDisplayNamesImpl(field, style, locale); } private Map<String,Integer> getDisplayNamesImpl(int field, int style, Locale locale) { DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale); --- 1536,1602 ---- } return null; } /** ! * Returns a {@code Map} containing all names of the calendar ! * {@code field} in the given {@code style} and ! * {@code locale} and their corresponding field values. For ! * example, if this {@code Calendar} is a {@link * GregorianCalendar}, the returned map would contain "Jan" to * {@link #JANUARY}, "Feb" to {@link #FEBRUARY}, and so on, in the * {@linkplain #SHORT short} style in an English locale. * + * <p>Narrow names may not be unique due to use of single characters, + * such as "S" for Sunday and Saturday. In that case narrow names are not + * included in the returned {@code Map}. + * * <p>The values of other calendar fields may be taken into * account to determine a set of display names. For example, if ! * this {@code Calendar} is a lunisolar calendar system and * the year value given by the {@link #YEAR} field has a leap * month, this method would return month names containing the leap * month name, and month names are mapped to their values specific * for the year. * * <p>The default implementation supports display names contained in ! * a {@link DateFormatSymbols}. For example, if {@code field} ! * is {@link #MONTH} and {@code style} is {@link ! * #ALL_STYLES}, this method returns a {@code Map} containing * all strings returned by {@link DateFormatSymbols#getShortMonths()} * and {@link DateFormatSymbols#getMonths()}. * * @param field * the calendar field for which the display names are returned * @param style * the style applied to the string representation; one of {@link * #SHORT_FORMAT} ({@link #SHORT}), {@link #SHORT_STANDALONE}, ! * {@link #LONG_FORMAT} ({@link #LONG}), {@link #LONG_STANDALONE}, ! * {@link #NARROW_FORMAT}, or {@link #NARROW_STANDALONE} * @param locale * the locale for the display names ! * @return a {@code Map} containing all display names in ! * {@code style} and {@code locale} and their ! * field values, or {@code null} if no display names ! * are defined for {@code field} * @exception IllegalArgumentException ! * if {@code field} or {@code style} is invalid, ! * or if this {@code Calendar} is non-lenient and any * of the calendar fields have invalid values * @exception NullPointerException ! * if {@code locale} is null * @since 1.6 */ public Map<String, Integer> getDisplayNames(int field, int style, Locale locale) { ! if (!checkDisplayNameParams(field, style, ALL_STYLES, NARROW_FORMAT, locale, ERA_MASK|MONTH_MASK|DAY_OF_WEEK_MASK|AM_PM_MASK)) { return null; } if (style == ALL_STYLES || isStandaloneStyle(style)) { return CalendarDataUtility.retrieveFieldValueNames(getCalendarType(), field, style, locale); } ! // SHORT, LONG, or NARROW return getDisplayNamesImpl(field, style, locale); } private Map<String,Integer> getDisplayNamesImpl(int field, int style, Locale locale) { DateFormatSymbols symbols = DateFormatSymbols.getInstance(locale);
*** 1597,1606 **** --- 1627,1642 ---- return isFieldSet(fieldMask, field); } private String[] getFieldStrings(int field, int style, DateFormatSymbols symbols) { int baseStyle = getBaseStyle(style); // ignore the standalone mask + + // DateFormatSymbols doesn't support any narrow names. + if (baseStyle == NARROW_FORMAT) { + return null; + } + String[] strings = null; switch (field) { case ERA: strings = symbols.getEras(); break;
*** 1946,1955 **** --- 1982,1995 ---- boolean isStandaloneStyle(int style) { return (style & STANDALONE_MASK) != 0; } + boolean isNarrowStyle(int style) { + return style == NARROW_FORMAT || style == NARROW_STANDALONE; + } + /** * Returns the pseudo-time-stamp for two fields, given their * individual pseudo-time-stamps. If either of the fields * is unset, then the aggregate is unset. Otherwise, the * aggregate is the later of the two stamps.