Move new internal Calendar APIs to CalendarUtils and refactor.

This commit is contained in:
Gary Gregory 2022-05-15 15:51:31 -04:00
parent eff43864b3
commit 25e91c4242
5 changed files with 103 additions and 75 deletions

View File

@ -18,6 +18,8 @@
package org.apache.commons.lang3.time;
import java.util.Calendar;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
/**
@ -32,17 +34,40 @@ public class CalendarUtils {
*/
public static final CalendarUtils INSTANCE = new CalendarUtils(Calendar.getInstance());
/**
* Gets a CalendarUtils using the default time zone and specified locale. The <code>CalendarUtils</code> returned is based on the current time in the
* default time zone with the given locale.
*
* @param locale the locale for the week data
* @return a Calendar.
*/
static CalendarUtils getInstance(final Locale locale) {
return new CalendarUtils(Calendar.getInstance(locale), locale);
}
private final Calendar calendar;
private final Locale locale;
/**
* Creates an instance for the given Calendar.
*
* @param calendar A Calendar.
*/
public CalendarUtils(final Calendar calendar) {
this.calendar = Objects.requireNonNull(calendar, "calendar");
this(calendar, Locale.getDefault());
}
/**
* Creates an instance for the given Calendar.
*
* @param calendar A Calendar.
* @param locale A Locale.
*/
CalendarUtils(final Calendar calendar, final Locale locale) {
this.calendar = Objects.requireNonNull(calendar, "calendar");
this.locale = Objects.requireNonNull(locale, "locale");
}
/**
* Gets the current day of month.
*
@ -61,6 +86,43 @@ public class CalendarUtils {
return calendar.get(Calendar.MONTH);
}
/**
* 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
*/
String[] getMonthDisplayNames(final int style) {
// Unfortunately standalone month names are not available in DateFormatSymbols,
// so we have to extract them.
final Calendar calendar = Calendar.getInstance(locale);
final Map<String, Integer> displayNames = calendar.getDisplayNames(Calendar.MONTH, style, locale);
if (displayNames == null) {
return null;
}
final String[] monthNames = new String[displayNames.size()];
for (final Map.Entry<String, Integer> entry: displayNames.entrySet()) {
monthNames[entry.getValue()] = entry.getKey();
}
return monthNames;
}
/**
* Gets full standalone month names as used in "LLLL" date formatting.
* @return Long names of months
*/
String[] getStandaloneLongMonthNames() {
return getMonthDisplayNames(Calendar.LONG_STANDALONE);
}
/**
* Gets short standalone month names as used in "LLLL" date formatting.
* @return Short names of months
*/
String[] getStandaloneShortMonthNames() {
return getMonthDisplayNames(Calendar.SHORT_STANDALONE);
}
/**
* Gets the current year.
*

View File

@ -22,7 +22,6 @@ 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;
@ -1832,40 +1831,4 @@ 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);
final Map<String, Integer> displayNames = calendar.getDisplayNames(Calendar.MONTH, style, locale);
final String[] monthNames = new String[displayNames.size()];
for (final Map.Entry<String, Integer> entry: displayNames.entrySet()) {
monthNames[entry.getValue()] = entry.getKey();
}
return monthNames;
}
}

View File

@ -235,9 +235,9 @@ public class FastDatePrinter implements DatePrinter, Serializable {
break;
case 'L': // month in year (text and number)
if (tokenLen >= 4) {
rule = new TextField(Calendar.MONTH, DateUtils.getStandaloneLongMonths(mLocale));
rule = new TextField(Calendar.MONTH, CalendarUtils.getInstance(mLocale).getStandaloneLongMonthNames());
} else if (tokenLen == 3) {
rule = new TextField(Calendar.MONTH, DateUtils.getStandaloneShortMonths(mLocale));
rule = new TextField(Calendar.MONTH, CalendarUtils.getInstance(mLocale).getStandaloneShortMonthNames());
} else if (tokenLen == 2) {
rule = TwoDigitMonthField.INSTANCE;
} else {

View File

@ -20,6 +20,7 @@ package org.apache.commons.lang3.time;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Calendar;
import java.util.Locale;
import org.junit.jupiter.api.Test;
@ -35,9 +36,46 @@ public class CalendarUtilsTest {
assertEquals(Calendar.getInstance().get(Calendar.MONTH), CalendarUtils.INSTANCE.getMonth());
}
@Test
public void testGetStandaloneLongMonthNames() {
final String[] monthNames = CalendarUtils.getInstance(Locale.GERMAN).getStandaloneLongMonthNames();
assertEquals(12, monthNames.length);
assertEquals("Januar", monthNames[0]);
assertEquals("Februar", monthNames[1]);
assertEquals("M\u00e4rz", monthNames[2]);
assertEquals("April", monthNames[3]);
assertEquals("Mai", monthNames[4]);
assertEquals("Juni", monthNames[5]);
assertEquals("Juli", monthNames[6]);
assertEquals("August", monthNames[7]);
assertEquals("September", monthNames[8]);
assertEquals("Oktober", monthNames[9]);
assertEquals("November", monthNames[10]);
assertEquals("Dezember", monthNames[11]);
}
@Test
public void testGetStandaloneShortMonthNames() {
final String[] monthNames = CalendarUtils.getInstance(Locale.GERMAN).getStandaloneShortMonthNames();
assertEquals(12, monthNames.length);
assertEquals("Jan", monthNames[0]);
assertEquals("Feb", monthNames[1]);
assertEquals("M\u00e4r", monthNames[2]);
assertEquals("Apr", monthNames[3]);
assertEquals("Mai", monthNames[4]);
assertEquals("Jun", monthNames[5]);
assertEquals("Jul", monthNames[6]);
assertEquals("Aug", monthNames[7]);
assertEquals("Sep", monthNames[8]);
assertEquals("Okt", monthNames[9]);
assertEquals("Nov", monthNames[10]);
assertEquals("Dez", monthNames[11]);
}
@Test
public void testGetYear() {
assertEquals(Calendar.getInstance().get(Calendar.YEAR), CalendarUtils.INSTANCE.getYear());
}
}

View File

@ -1695,40 +1695,5 @@ public class DateUtilsTest {
}
}
@Test
public void testGetStandaloneLongMonthNames() {
final String[] monthNames = DateUtils.getStandaloneLongMonths(Locale.GERMAN);
assertEquals(12, monthNames.length);
assertEquals("Januar", monthNames[0]);
assertEquals("Februar", monthNames[1]);
assertEquals("M\u00e4rz", monthNames[2]);
assertEquals("April", monthNames[3]);
assertEquals("Mai", monthNames[4]);
assertEquals("Juni", monthNames[5]);
assertEquals("Juli", monthNames[6]);
assertEquals("August", monthNames[7]);
assertEquals("September", monthNames[8]);
assertEquals("Oktober", monthNames[9]);
assertEquals("November", monthNames[10]);
assertEquals("Dezember", monthNames[11]);
}
@Test
public void testGetStandaloneShortMonthNames() {
final String[] monthNames = DateUtils.getStandaloneShortMonths(Locale.GERMAN);
assertEquals(12, monthNames.length);
assertEquals("Jan", monthNames[0]);
assertEquals("Feb", monthNames[1]);
assertEquals("M\u00e4r", monthNames[2]);
assertEquals("Apr", monthNames[3]);
assertEquals("Mai", monthNames[4]);
assertEquals("Jun", monthNames[5]);
assertEquals("Jul", monthNames[6]);
assertEquals("Aug", monthNames[7]);
assertEquals("Sep", monthNames[8]);
assertEquals("Okt", monthNames[9]);
assertEquals("Nov", monthNames[10]);
assertEquals("Dez", monthNames[11]);
}
}