Название месяца в виде строки - PullRequest
75 голосов
/ 31 мая 2011

Я пытаюсь вернуть название месяца в виде строки, например "май", "сентябрь", "ноябрь".

Я пытался:

int month = c.get(Calendar.MONTH);

Однако, это возвращает целые числа (5, 9, 11, соответственно). Как я могу получить название месяца?

Ответы [ 10 ]

144 голосов
/ 19 декабря 2011

Используйте это:

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());
92 голосов
/ 31 января 2014

Для получения месяца в строковой переменной используйте код ниже

Например, сентябрь месяц:

M -> 9

MM -> 09

МММ -> сентябрь

ММММ -> сентябрь

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
83 голосов
/ 31 мая 2011

Использовать getDisplayName .

Для более раннего использования API String.format(Locale.US,"%tB",c);

37 голосов
/ 15 августа 2014

«ММММ» определенно НЕ является правильным решением (даже если оно работает для многих языков), используйте шаблон «LLLL» с SimpleDateFormat

Поддержка платформы 'L' как ICU-совместимого расширения для автономных названий месяцев была добавлена ​​на платформу Android июнь. 2010 .

Даже если в английском языке нет разницы между кодировкой 'MMMM' и 'LLLL', вам следует подумать и о других языках.

например. это то, что вы получаете, если вы используете Calendar.getDisplayName или шаблон "MMMM" для января с русским Locale:

января (что верно для полной строки даты: " 10 января, 2014 ")

но в случае отдельного названия месяца вы ожидаете:

* 1025 январь *

Правильное решение:

 SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
 dateFormat.format( date );

Если вас интересует, откуда берутся все переводы - вот ссылка на переводы григорианского календаря (другие календари, связанные в верхней части страницы).

15 голосов
/ 24 апреля 2014

Так просто, как это

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
9 голосов
/ 31 мая 2011

Я держу этот ответ, который полезен для других случаев, но ответ @trutheality представляется наиболее простым и прямым.

Вы можете использовать DateFormatSymbols

DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
4 голосов
/ 26 апреля 2017

Единственный способ для Android получить правильно отформатированное название месяца в станалоне для таких языков, как украинский, русский, чешский

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

Вывод для Май это май но не Мая

2 голосов
/ 31 мая 2017

Я бы порекомендовал использовать 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

1 голос
/ 01 ноября 2018

Пример способа получения даты и времени в этом формате "2018 Nov 01 16:18:22" используйте это

DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
        Date date = new Date();
         dateFormat.format(date);
0 голосов
/ 27 февраля 2016

Получение автономного названия месяца на удивление трудно выполнить «правильно» в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...