From ff9e733993b73914c2f1b6677a70f485b8ae0d56 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Mon, 18 May 2026 08:19:48 -0400 Subject: [PATCH] FastDatePrinter WeekYear rule calls Calendar.getWeekYear() without checking isWeekDateSupported() The method would throw UnsupportedOperationException --- .../commons/lang3/time/FastDatePrinter.java | 4 ++- .../lang3/time/FastDateFormatTest.java | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) 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 6063e8aafb2..42a309f02d1 100644 --- a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java +++ b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java @@ -862,7 +862,9 @@ private static final class WeekYear implements NumberRule { @Override public void appendTo(final Appendable buffer, final Calendar calendar) throws IOException { - rule.appendTo(buffer, calendar.getWeekYear()); + // Some Calendar implementations (JapaneseImperialCalendar) do not support week-dates. + // Fall back to Calendar.YEAR in that case. + rule.appendTo(buffer, calendar.isWeekDateSupported() ? calendar.getWeekYear() : calendar.get(Calendar.YEAR)); } @Override diff --git a/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java b/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java index b992164e862..6c084b634ff 100644 --- a/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java +++ b/src/test/java/org/apache/commons/lang3/time/FastDateFormatTest.java @@ -110,6 +110,36 @@ private AtomicLongArray measureTime(final Format printer, final Format parser) t return totalElapsed; } + /** + * Pre-patch: UnsupportedOperationException when formatting a Japanese Imperial Calendar with 'Y' (week-year) pattern. + *

+ * Post-patch: falls back to Calendar.YEAR and formats successfully. + *

+ */ + @Test + void testJapaneseImperialCalendarWeekYearDoesNotThrow() { + final Locale japaneseImperial = new Locale("ja", "JP", "JP"); + final Calendar japaneseCal = Calendar.getInstance(japaneseImperial); + final FastDateFormat fdp = FastDateFormat.getInstance("YYYY-MM-dd"); + assertNotNull(fdp.format(japaneseCal), "Formatting JapaneseImperialCalendar with YYYY pattern must not throw UnsupportedOperationException"); + } + + /** + * Pre-patch: UnsupportedOperationException when formatting a Japanese Imperial + *

+ * Calendar with 'Y' (week-year) pattern. Post-patch: falls back to Calendar.YEAR and formats successfully. + *

+ *

+ * Also test that a regular Gregorian calendar works fine with YYYY. + *

+ */ + @Test + void testGregorianCalendarWeekYearWorks() { + final Calendar cal = Calendar.getInstance(); + final FastDateFormat fdp = FastDateFormat.getInstance("YYYY-MM-dd"); + assertNotNull(fdp.format(cal), "Formatting Gregorian Calendar with YYYY pattern should always work"); + } + @DefaultLocale(language = "en", country = "US") @Test void test_changeDefault_Locale_DateInstance() {