You can use DateTimeFormatterBuilder
with optional patterns. These will be tried in the order you append them. A DateTimeException
will still be thrown if all patterns fail.
final DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("EEEE"))
.appendOptional(DateTimeFormatter.ofPattern("E"))
.toFormatter(locale);
final DayOfWeek dow1 = DayOfWeek.from(dtf.parse("Mon"));
final DayOfWeek dow2 = DayOfWeek.from(dtf.parse("Monday"));
Note how the resulting DayOfWeek
can now be final if you want.
Try that same code across multiple languages (multiple locales).
for ( final Locale locale : new Locale[] { Locale.US , Locale.CANADA_FRENCH , Locale.ITALY , Locale.KOREA } ) {
final String inputShort = ( DayOfWeek.MONDAY.getDisplayName ( TextStyle.SHORT, locale ) );
final String inputFull = ( DayOfWeek.MONDAY.getDisplayName ( TextStyle.FULL, locale ) );
final DateTimeFormatter dtf = new DateTimeFormatterBuilder ( )
.appendOptional ( DateTimeFormatter.ofPattern ( "EEEE" ) )
.appendOptional ( DateTimeFormatter.ofPattern ( "E" ) )
.toFormatter ( locale );
final DayOfWeek dow1 = DayOfWeek.from ( dtf.parse ( inputShort ) );
final DayOfWeek dow2 = DayOfWeek.from ( dtf.parse ( inputFull ) );
System.out.println ( "" );
System.out.println ( "Language: " + locale.getDisplayLanguage ( Locale.US ) );
System.out.println ( "inputShort: " + inputShort + " | dow1: " + dow1 );
System.out.println ( "inputFull: " + inputFull + " | dow2: " + dow2 );
}
When run.
Language: English
inputShort: Mon | dow1: MONDAY
inputFull: Monday | dow2: MONDAY
Language: French
inputShort: lun. | dow1: MONDAY
inputFull: lundi | dow2: MONDAY
Language: Italian
inputShort: lun | dow1: MONDAY
inputFull: lunedì | dow2: MONDAY
Locale: Korean
inputShort: 월 | dow1: MONDAY
inputFull: 월요일 | dow2: MONDAY