Название месяца в виде строки

89

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

Я старался:

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

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

Габи
источник

Ответы:

88

Используйте getDisplayName .

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

правдивость
источник
У меня проблема: getDisplayName (month, Calendar.LONG, Locale.US) И Eclipse сообщает мне, что Calendar.LONG или Calendar.SHORT не существуют.
Габи
Это очень странно. Вы используете, java.util.Calendarа не какой-то другой Calendarкласс, верно?
правдивость
да. Похоже, что getDisplayName () и связанные Calendar.LONG и Calendar.SHORT - это только уровень API 9. Итак, это работает для уровня 9, но мне нужно для уровня 7 :(
Габи
3
Formatter f = new Formatter();(при желании вы можете указать язык), затем String monthName = f.format("%tB",c).toString();или %tbдля краткого имени.
правдивость
5
также использование Locale.getDefault () вместо Locale.US могло бы быть хорошей идеей :)
Shine
159

Использовать это :

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());
Джон
источник
13
«ММММ» хватило бы на первый случай.
янченко 02
115

Чтобы получить месяц в строковой переменной, используйте код ниже

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

M -> 9

ММ -> 09

МММ -> сен

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

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
Арун Антони
источник
1
да, спасибо, это работает как шарм, на всех языках , я использую (французский, английский, немецкий)
Chrysotribax
45

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

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

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

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

января (что правильно для полной строки даты: « 10 января 2014 »)

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

январь

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

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

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

artkoenig
источник
'LLLL' доступен только с Java 8, вы можете использовать 'MMMM' с SimpleDateFormat, и он отлично работает и для автономной версии.
juanheyns
Для ясности, на русском языке «Января» переводится в родительном падеже, означающем «январь», тогда как «Январь» в именительном падеже означает просто «январь». могут быть другие славянские языки с этим различием, например украинский и сербский. Это просто грамматически и обычно не слишком важно. Но варианты использования, приведенные в этом ответе, грамматически правильны: используйте MMMM для полных дат и LLLL при отображении месяца отдельно, если вы хотите быть как можно более правильным.
moonlightcheese
23

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

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

Calendar.LONG - это полное название месяца, а Calendar.SHORT - его краткое название. Например: Calendar.LONG вернет январь Calendar.SHORT вернет Jan

сандалон
источник
Отличный ответ. Я сам настраивал календарь на будильник, и мне нужно было узнать название месяца позже. Идеальный
ответ.Спасибо
10

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

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

DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
МБыД
источник
5

Единственный способ на 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

Выход на май - Май, но не Мая

Дмитрий
источник
3

Русский.

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    new Locale( "ru" , "RU" )
)

май

Английский в США.

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    Locale.US
)

май

Посмотрите, как этот код запускается вживую на IdeOne.com .

ThreeTenABP и java.time

Вот современный ответ. Когда этот вопрос был задан в 2011 году, CalendarиGregorianCalendar обычно использовался для даты и времени , несмотря на то, что они всегда были плохо разработаны. Это было 8 лет назад, и эти классы давно устарели. Предполагая, что вы еще не на уровне API 26, я предлагаю использовать библиотеку ThreeTenABP, которая содержит адаптированный для Android бэкпорт java.time, современного API даты и времени Java. С java.time намного приятнее работать.

В зависимости от ваших конкретных потребностей и ситуации есть два варианта:

  1. Использовать Month и его getDisplayNameметод.
  2. Использовать DateTimeFormatter .

Месяц использования

    Locale desiredLanguage = Locale.ENGLISH;
    Month m = Month.MAY;
    String monthName = m.getDisplayName(TextStyle.FULL, desiredLanguage);
    System.out.println(monthName);

Вывод из этого фрагмента:

май

На нескольких языках будет иметь значение, используете ли вы TextStyle.FULL или TextStyle.FULL_STANDALONE. Вам нужно будет увидеть, возможно, уточнить у ваших пользователей, какой из двух подходит для вашего контекста.

Используйте DateTimeFormatter

Если у вас есть свидание с указанием времени суток или без него, я найду DateTimeFormatterболее практичный вариант. Например:

    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM", desiredLanguage);

    ZonedDateTime dateTime = ZonedDateTime.of(2019, 5, 31, 23, 49, 51, 0, ZoneId.of("America/Araguaina"));
    String monthName = dateTime.format(monthFormatter);

Я показываю использование a ZonedDateTime, ближайшей замены старому Calendarклассу. Приведенный выше код будет работать для LocalDate, А LocalDateTime, MonthDay, OffsetDateTimeи аYearMonth тоже.

Что делать, если вы получили Calendarот устаревшего API, еще не обновленного до java.time? Преобразуйте в a ZonedDateTimeи действуйте, как указано выше:

    Calendar c = getCalendarFromLegacyApi();
    ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);

В остальном все как раньше.

Вопрос: Разве java.time не требует Android API 26 уровня?

java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6 .

  • В Java 8 и новее, а также на новых устройствах Android (начиная с уровня API 26) современный API встроен.
  • В Java 6 и 7, отличных от Android, получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старом) Android используйте Android-версию ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bpподпакетов.

Ссылки

Оле В.В.
источник
2

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

Аяз Алифов
источник
2

Пример способа получения даты и времени в формате «01 ноября 2018 г. 16:18:22».

DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
        Date date = new Date();
         dateFormat.format(date);
Мудасир Хан
источник
0

Получение отдельного названия месяца на 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;
}
BlakeTNC
источник
0

Получите название месяца в String.

 private String getMonthName() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
    String month_name = month_date.format(cal.getTime());
    return month_name;
}

Применение:

String monthName = getMonthName();
Зишан Али
источник
Не используйте давно устаревшие и заведомо проблемные SimpleDateFormatклассы и друзей. Посмотрите, можете ли вы использовать десугарирование или добавить ThreeTenABP в свой проект Android, чтобы использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.
Оле В.В.
Вы вносите большой вклад, которого еще нет в самом популярном ответе Джона?
Оле В.В.