Here's a way of doing it without having to use Patterns:
package com.stackoverflow;
import static java.time.format.TextStyle.FULL;
import static java.time.temporal.ChronoField.*;
import static java.util.Locale.*;
import java.time.*;
import java.time.format.*;
import java.util.Locale;
import java.util.stream.Stream;
public class StackOverflow_69074793 {
private static final DateTimeFormatter FMT_DEFAULT = new DateTimeFormatterBuilder()
.appendValue(DAY_OF_MONTH , 2 ).appendLiteral(' ')
.appendText (MONTH_OF_YEAR, FULL).appendLiteral(' ')
.appendValue(YEAR) .toFormatter(Locale.getDefault());
private static final DateTimeFormatter FMT_FRANCE = FMT_DEFAULT.withLocale(FRANCE);
private static final DateTimeFormatter FMT_ITALY = FMT_DEFAULT.withLocale(ITALY);
public static void main(final String[] args) {
Stream.of(
LocalDate.of(1804, Month.FEBRUARY, 29),
LocalDate.of(1900, Month.MAY, 1),
LocalDate.of(2000, Month.AUGUST, 31),
LocalDate.of(2025, Month.SEPTEMBER, 6)
)
.forEach(temporalAccessor -> {
System.out.println("France..: " + FMT_FRANCE .format(temporalAccessor));
System.out.println("Italy...: " + FMT_ITALY .format(temporalAccessor));
System.out.println("Default.: " + FMT_DEFAULT.format(temporalAccessor));
System.out.println();
});
}
}