Имя месяца в виде строки
Я пытаюсь вернуть имя месяца в виде строки, например "май", "сентябрь", "ноябрь".
пробовал:
int month = c.get(Calendar.MONTH);
однако, это возвращает целые числа (5, 9, 11, соответственно). Как я могу получить название месяца?
9 ответов:
использовать getDisplayName.
для более раннего использования API
String.format(Locale.US,"%tB",c);
используйте этот :
Calendar cal=Calendar.getInstance(); SimpleDateFormat month_date = new SimpleDateFormat("MMMM"); String month_name = month_date.format(cal.getTime());
имя месяца будет содержать полное имя месяца, если вы хотите использовать короткое имя месяца это
SimpleDateFormat month_date = new SimpleDateFormat("MMM"); String month_name = month_date.format(cal.getTime());
для получения месяца в строковой переменной используйте код ниже
например месяц сентябрь:
M - > 9
мм -> 09
МММ - > Sep
мммм - >
String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
"мммм" определенно не является правильным решением (он работает случайно для некоторых языков, таких как английский), используйте шаблон "LLLL" с
SimpleDateFormat
поддержка " L " в качестве ICU-совместимого расширения для автономных имен месяцев была добавлена на платформу Android на Jun. 2010.
даже если в английском языке нет разницы между кодировкой "MMMM" и "LLLL", вы должны думать и о других языках.
например, вот что вы получите, если вы используете
Calendar.getDisplayName
или шаблон "мммм" за январь с русскимLocale
:января (что верно для полной строки даты:"10 января,")
но в случае автономного названия месяца вы ожидаете:
январь
правильное решение:
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() ); dateFormat.format( date );
если вас интересует, откуда берутся все переводы -вот ссылка к переводам григорианского календаря (другие календари, связанные в верхней части страницы).
просто
mCalendar = Calendar.getInstance(); String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
Я сохраняю этот ответ, который полезен для других случаев, но ответ @trutheality кажется самым простым и прямым способом.
можно использовать DateFormatSymbols
DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
единственный способ на Android получить правильно отформатированное имя месяца stanalone для таких языков, как украинский, русский, чешский
private String getMonthName(Calendar calendar, boolean short) { int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_MONTH_DAY | DateUtils.FORMAT_NO_YEAR; if (short) { flags |= DateUtils.FORMAT_ABBREV_MONTH; } return DateUtils.formatDateTime(getContext(), calendar.getTimeInMillis(), flags); }
протестировано на API 15-25
выход мая и Май а не Мая
Я бы рекомендовал использовать
Calendar
объект иLocale
поскольку названия месяцев различны для разных языков:// index can be 0 - 11 private String getMonthName(final int index, final Locale locale, final boolean shortName) { String format = "%tB"; if (shortName) format = "%tb"; Calendar calendar = Calendar.getInstance(locale); calendar.set(Calendar.MONTH, index); calendar.set(Calendar.DAY_OF_MONTH, 1); return String.format(locale, format, calendar); }
пример для полного названия месяца:
System.out.println(getMonthName(0, Locale.US, false));
результат:
January
пример для короткого названия месяца:
System.out.println(getMonthName(0, Locale.US, true));
результат:
Jan
получение автономного имени месяца удивительно сложно выполнить "правильно" на Java. (По крайней мере на момент написания этой статьи. В настоящее время я использую Java 8).
проблема в том, что на некоторых языках, включая русский и чешский, автономная версия названия месяца отличается от версии "форматирования". Кроме того, похоже, что ни один Java API просто не даст вам "лучшую" строку. Большинство ответов, опубликованных здесь до сих пор, предлагают только версию форматирования. Вставлено ниже рабочее решение для получения автономной версии имени одного месяца или получения массива со всеми из них.
Я надеюсь, что это сэкономит кому-то еще некоторое время!
/** * getStandaloneMonthName, This returns a standalone month name for the specified month, in the * specified locale. In some languages, including Russian and Czech, the standalone version of * the month name is different from the version of the month name you would use as part of a * full date. (Different from the formatting version). * * This tries to get the standalone version first. If no mapping is found for a standalone * version (Presumably because the supplied language has no standalone version), then this will * return the formatting version of the month name. */ private static String getStandaloneMonthName(Month month, Locale locale, boolean capitalize) { // Attempt to get the standalone version of the month name. String monthName = month.getDisplayName(TextStyle.FULL_STANDALONE, locale); String monthNumber = "" + month.getValue(); // If no mapping was found, then get the formatting version of the month name. if (monthName.equals(monthNumber)) { DateFormatSymbols dateSymbols = DateFormatSymbols.getInstance(locale); monthName = dateSymbols.getMonths()[month.getValue()]; } // If needed, capitalize the month name. if ((capitalize) && (monthName != null) && (monthName.length() > 0)) { monthName = monthName.substring(0, 1).toUpperCase(locale) + monthName.substring(1); } return monthName; } /** * getStandaloneMonthNames, This returns an array with the standalone version of the full month * names. */ private static String[] getStandaloneMonthNames(Locale locale, boolean capitalize) { Month[] monthEnums = Month.values(); ArrayList<String> monthNamesArrayList = new ArrayList<>(); for (Month monthEnum : monthEnums) { monthNamesArrayList.add(getStandaloneMonthName(monthEnum, locale, capitalize)); } // Convert the arraylist to a string array, and return the array. String[] monthNames = monthNamesArrayList.toArray(new String[]{}); return monthNames; }