Как получить чешское название месяца

У меня проблема с получением имени месяца на моем языке – чешском.

Я хочу получить имя месяца как существительное, но я всегда получаю завышенное название. Я пробовал много способов получить имя, но все пути возвращают измененное название месяца

Например, я хочу получить название октябрь в чешском «Říjen», но я всегда получаю «října».

Calendar cal=Calendar.getInstance(); SimpleDateFormat month_date = new SimpleDateFormat("MMMMMMMMM"); String month_name = month_date.format(cal.getTime()); DateFormat formatData = new SimpleDateFormat("d.MMMM yyyy H:mm"); System.out.println(month_name); System.out.println(String.format(Locale.getDefault(),"%tB", cal)); System.out.println(formatData.format(cal.getTime())); 

Все возвращает плохой формат для меня. Есть ли способ получить правильное название месяца? спасибо

Использование этого примера кода

 public static void main(String[] args) { Calendar cal= Calendar.getInstance(); Locale loc = new Locale("cs", "CZ"); System.out.println(String.format(loc,"%tB", cal)); } 

Я получаю вывод

? Ijen

Который выглядит так, как вы хотите (я четко определил ваш язык).

Вы можете решить это уже, но вот решение. Я сделал небольшое исследование, и причина в изменении java.text.DateFormatSymbols в Java 8 (см. Руководство по совместимости ).

Существует различие между форматированием и отдельными формами. Форматы форматирования: ledna, února, března и т. Д .; Автономные формы: leden, únor, březen и т. Д.

Кроме того, согласно правилам языка, название месяца, когда оно стоит отдельно, начинается с нижнего символа, если только оно не начинает предложение.

Этот код предоставит вам желаемый результат.

 public static void main(String[] args) { Calendar cal = Calendar.getInstance(); Locale loc = new Locale("cs", "CZ"); System.out.println(cal.getDisplayName(Calendar.MONTH, Calendar.LONG_STANDALONE, loc)); } 

В итоге я нахожу лучшее решение этой проблемы. Проблема в том, что формат «MMMM» используется для «отформатированного имени» месяца (fe «ledna»). Если вам нужно «автономное имя» месяца (fe «leden»), вам нужно использовать «LLLL». Полную документацию формата даты можно найти здесь:

https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

Вот простой пример:

DateFormat.format("LLLL yyyy", date).toString().capitalize() // returns: Leden 2016

а также

 DateFormat.format("MMMM yyyy", date).toString() // returns ledna 2016 

Это решение работает для всех API. Примите это как правильный ответ.

ТЛ; др

 Month.OCTOBER.getDisplayName ( TextStyle.FULL_STANDALONE , new Locale ( "cs", "CZ" ) ) 

Rijen

Благодаря ответу MikeX за то, что это «автономный» язык. В отличие от английского, некоторые языки, такие как чешский, изменяют правописание месяца в зависимости от контекста его использования.

Использование java.time

В современном подходе используются классы java.time. Вопросы и другие ответы устарели, используя неприятные старые классы времени ( Calendar , SimpleDateFormat , DateFormat и т. Д.), DateFormat теперь являются устаревшими, полностью вытесняются классами java.time. См. Ниже для back-port для Android.

Month::getDisplayName Month является метод локализации имени месяца: Month::getDisplayName . Передайте TextStyle обозначающий полный узкоколейный и хотите ли вы автономный или комбинированный тип.

Когда можно просмотреть их, чтобы увидеть все возможные результаты.

 Locale locale = new Locale ( "cs", "CZ" ); for ( Month month : EnumSet.allOf ( Month.class ) ) { System.out.println ( "\nMonth: " + month ); for ( TextStyle textStyle : EnumSet.allOf ( TextStyle.class ) ) { String output = month.getDisplayName ( textStyle, locale ) + " | " + textStyle; System.out.println ( output ); } } 
 Month: JANUARY ledna | FULL leden | FULL_STANDALONE Led | SHORT I | SHORT_STANDALONE l | NARROW l | NARROW_STANDALONE Month: FEBRUARY února | FULL únor | FULL_STANDALONE Úno | SHORT II | SHORT_STANDALONE ú | NARROW ú | NARROW_STANDALONE Month: MARCH března | FULL březen | FULL_STANDALONE Bře | SHORT III | SHORT_STANDALONE b | NARROW b | NARROW_STANDALONE Month: APRIL dubna | FULL duben | FULL_STANDALONE Dub | SHORT IV | SHORT_STANDALONE d | NARROW d | NARROW_STANDALONE Month: MAY května | FULL květen | FULL_STANDALONE Kvě | SHORT V | SHORT_STANDALONE k | NARROW k | NARROW_STANDALONE Month: JUNE června | FULL červen | FULL_STANDALONE Čer | SHORT VI | SHORT_STANDALONE č | NARROW č | NARROW_STANDALONE Month: JULY července | FULL červenec | FULL_STANDALONE Čvc | SHORT VII | SHORT_STANDALONE č | NARROW č | NARROW_STANDALONE Month: AUGUST srpna | FULL srpen | FULL_STANDALONE Srp | SHORT VIII | SHORT_STANDALONE s | NARROW s | NARROW_STANDALONE Month: SEPTEMBER září | FULL září | FULL_STANDALONE Zář | SHORT IX | SHORT_STANDALONE z | NARROW z | NARROW_STANDALONE Month: OCTOBER října | FULL říjen | FULL_STANDALONE Říj | SHORT X | SHORT_STANDALONE ř | NARROW ř | NARROW_STANDALONE Month: NOVEMBER listopadu | FULL listopad | FULL_STANDALONE Lis | SHORT XI | SHORT_STANDALONE l | NARROW l | NARROW_STANDALONE Month: DECEMBER prosince | FULL prosinec | FULL_STANDALONE Pro | SHORT XII | SHORT_STANDALONE p | NARROW p | NARROW_STANDALONE 

О java.time

Рамка java.time встроена в Java 8 и более поздних версий . Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date , Calendar и SimpleDateFormat .

Проект Joda-Time , теперь в режиме обслуживания , советует перейти на классы java.time .

Дополнительную информацию можно найти в учебнике Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .

Где получить классы java.time?

  • Java SE 8 , Java SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
    • См. Как использовать ThreeTenABP ….