aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/apache/commons/lang3/time
diff options
context:
space:
mode:
authorSteve Bosman <104826360+stevebosman-oc@users.noreply.github.com>2022-05-15 20:13:41 +0100
committerGitHub <noreply@github.com>2022-05-15 15:13:41 -0400
commit127869e88f248da9bea3ba20beb620c7f2479abb (patch)
tree64ed960bc3fae494ef0899dfc5d9b3f426c952dd /src/main/java/org/apache/commons/lang3/time
parenta2ed219fb8ae0c5c453a069863359b4ba69ff230 (diff)
downloadapache-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')
-rw-r--r--src/main/java/org/apache/commons/lang3/time/DateUtils.java37
-rw-r--r--src/main/java/org/apache/commons/lang3/time/FastDateParser.java1
-rw-r--r--src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java11
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;