Как я могу отформатировать день и месяц в правильном для локали порядке в Java? - PullRequest
1 голос
/ 28 июня 2019

Есть ли способ отформатировать день и месяц (в компактной форме), но не год, в правильном для локали порядке в Java / Kotlin? Таким образом, для английского языка это должно быть «20 сентября», а для шведского «20 сентября».

Для сравнения, на платформах Какао я могу сделать следующее (в Swift):

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "sv_SE")
formatter.setLocalizedDateFormatFromTemplate("MMM d")
print(formatter.string(from: Date()))

Это правильно все изменит. Есть ли что-то подобное с Java SDK? Я пробовал разные формы с DateTimeFormatter и более старыми SimpleTimeFormat API, но безуспешно.

Примечания: В отличие от этого вопроса , мне не нужен полный средний формат, включающий год. Я также не хочу ни DateTimeFormatter.ofPattern("MMM d"), поскольку это дает неверный результат на шведском языке, либо DateTimeFormatter.ofPattern("d MMM"), поскольку это дает неправильный результат на английском языке.

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Нет, извините. Я не знаю ни одной библиотеки Java, которая бы автоматически превращала "MMM d" в 20 sep. для локали, которая предпочитает день месяца перед сокращением месяца.

Вы можете попробовать изменить ответ по Rowi следующим образом:

DateTimeFormatter ft = 
    DateTimeFormatter
    .ofLocalizedDate(FormatStyle.MEDIUM)
    .withLocale(Locale.forLanguageTag("sv-SE"))
;

Однако результат:

20 сентября 2019

Включает год, который вы не просили.

Расширенное решение будет использовать класс DateTimeFormatterBuilder для создания DateTimeFormatter объектов.

DateTimeFormatterBuilder
.getLocalizedDateTimePattern(
    FormatStyle.MEDIUM, 
    null, 
    IsoChronology.INSTANCE, 
    Locale.forLanguageTag("sv-SE")
)

Возвращает d MMM y. Измените эту строку, чтобы удалить y и пробел перед ней. Обратите внимание, что на других языках y может быть yy, yyyy или u и не может быть последним в строке. Передайте измененную строку шаблона формата в DateTimeFormatter.ofPattern.

Это может быть шатким. Даже если вы посмотрите строки шаблона формата для всех доступных языковых стандартов, следующая версия CLDR (откуда поступают строки) может все же содержать сюрприз. Но я думаю, что это лучшее, что мы можем сделать. Если бы это был я, я бы посоветовал вызвать исключение, если смогу обнаружить, что строка из getLocalizedDateTimePattern не похожа на строку, которую я знаю, как изменить.

2 голосов
/ 28 июня 2019

Вы можете сделать это в Java, используя LocalDate:

LocalDate dt = LocalDate.parse("2019-09-20"); 
System.out.println(dt);   
DateTimeFormatter ft = DateTimeFormatter.ofPattern("dd MMM", new Locale("sv","SE")); 
System.out.println(ft.format(dt));
...