Вот подход, который обновляет шаблон DateTimeFormatter с правильным суффиксным литералом, если он находит шаблон d'00'
, например, для дня месяца 1 он будет заменен на d'st'
.После того, как шаблон был обновлен, его можно просто передать в DateTimeFormatter, чтобы сделать все остальное.
private static String[] suffixes = {"th", "st", "nd", "rd"};
private static String updatePatternWithDayOfMonthSuffix(TemporalAccessor temporal, String pattern) {
String newPattern = pattern;
// Check for pattern `d'00'`.
if (pattern.matches(".*[d]'00'.*")) {
int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH);
int relevantDigits = dayOfMonth < 30 ? dayOfMonth % 20 : dayOfMonth % 30;
String suffix = suffixes[relevantDigits <= 3 ? relevantDigits : 0];
newPattern = pattern.replaceAll("[d]'00'", "d'" + suffix + "'");
}
return newPattern;
}
Требуется, чтобы исходный шаблон обновлялся непосредственно перед каждым вызовом форматирования, например,
public static String format(TemporalAccessor temporal, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(updatePatternWithDayOfMonthSuffix(temporal, pattern));
return formatter.format(temporal);
}
Так что это полезно, если шаблон форматирования определяется вне кода Java,например, шаблон, где, как будто вы можете определить шаблон в Java, тогда ответ @ OleV.V.может быть более подходящим