diff options
author | Steve Bosman <104826360+stevebosman-oc@users.noreply.github.com> | 2022-05-15 20:13:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-15 15:13:41 -0400 |
commit | 127869e88f248da9bea3ba20beb620c7f2479abb (patch) | |
tree | 64ed960bc3fae494ef0899dfc5d9b3f426c952dd /src/main/java/org/apache/commons/lang3/time | |
parent | a2ed219fb8ae0c5c453a069863359b4ba69ff230 (diff) | |
download | apache-commons-lang-127869e88f248da9bea3ba20beb620c7f2479abb.tar.gz |
LANG-1680 Add support for standalone month formats (#892)
Diffstat (limited to 'src/main/java/org/apache/commons/lang3/time')
3 files changed, 49 insertions, 0 deletions
diff --git a/src/main/java/org/apache/commons/lang3/time/DateUtils.java b/src/main/java/org/apache/commons/lang3/time/DateUtils.java index 33c61dcad..493136e51 100644 --- a/src/main/java/org/apache/commons/lang3/time/DateUtils.java +++ b/src/main/java/org/apache/commons/lang3/time/DateUtils.java @@ -22,6 +22,7 @@ import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.Locale; +import java.util.Map; import java.util.NoSuchElementException; import java.util.TimeZone; import java.util.concurrent.TimeUnit; @@ -1831,4 +1832,40 @@ public class DateUtils { } } + /** + * Gets full standalone month names as used in "LLLL" date formatting. + * @param locale Locale + * @return Long names of months + */ + static String[] getStandaloneLongMonths(final Locale locale) { + return getMonthNames(locale, Calendar.LONG_STANDALONE); + } + + /** + * Gets short standalone month names as used in "LLLL" date formatting. + * @param locale Locale + * @return Short names of months + */ + static String[] getStandaloneShortMonths(final Locale locale) { + return getMonthNames(locale, Calendar.SHORT_STANDALONE); + } + + /** + * Gets month names in the requested style. + * @param locale Locale + * @param style Must be a valid {@link Calendar#getDisplayNames(int, int, Locale)} month style. + * @return Styled names of months + */ + private static String[] getMonthNames(final Locale locale, final int style) { + // Unfortunately standalone month names are not available in DateFormatSymbols, + // so we have to extract them. + final Calendar calendar = Calendar.getInstance(locale); + Map<String, Integer> displayNames = calendar.getDisplayNames(Calendar.MONTH, style, locale); + final String[] monthNames = new String[displayNames.size()]; + for (Map.Entry<String, Integer> entry: displayNames.entrySet()) { + monthNames[entry.getValue()] = entry.getKey(); + } + return monthNames; + } + } diff --git a/src/main/java/org/apache/commons/lang3/time/FastDateParser.java b/src/main/java/org/apache/commons/lang3/time/FastDateParser.java index 19b882456..98b48d261 100644 --- a/src/main/java/org/apache/commons/lang3/time/FastDateParser.java +++ b/src/main/java/org/apache/commons/lang3/time/FastDateParser.java @@ -606,6 +606,7 @@ public class FastDateParser implements DateParser, Serializable { case 'K': // Hour in am/pm (0-11) return HOUR_STRATEGY; case 'M': + case 'L': return width >= 3 ? getLocaleSpecificStrategy(Calendar.MONTH, definingCalendar) : NUMBER_MONTH_STRATEGY; case 'S': return MILLISECOND_STRATEGY; diff --git a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java index 00651587d..df5f1b72d 100644 --- a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java +++ b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java @@ -233,6 +233,17 @@ public class FastDatePrinter implements DatePrinter, Serializable { rule = UnpaddedMonthField.INSTANCE; } break; + case 'L': // month in year (text and number) + if (tokenLen >= 4) { + rule = new TextField(Calendar.MONTH, DateUtils.getStandaloneLongMonths(mLocale)); + } else if (tokenLen == 3) { + rule = new TextField(Calendar.MONTH, DateUtils.getStandaloneShortMonths(mLocale)); + } else if (tokenLen == 2) { + rule = TwoDigitMonthField.INSTANCE; + } else { + rule = UnpaddedMonthField.INSTANCE; + } + break; case 'd': // day in month (number) rule = selectNumberRule(Calendar.DAY_OF_MONTH, tokenLen); break; |