Назва місяця як рядок


89

Я намагаюся повернути назву місяця як рядок, наприклад "травень", "вересень", "листопад".

Я намагався:

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

Однак це повертає цілі числа (5, 9, 11 відповідно). Як я можу отримати назву місяця?

Відповіді:


88

Використовуйте getDisplayName .

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


У мене проблема: getDisplayName (місяць, Calendar.LONG, Locale.US) І Eclipse повідомляє мені Calendar.LONG або Calendar.SHORT не існує.
Gaby

Це дуже дивно. Ви використовуєте, 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

160

Використовуй це :

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
"MMMM" було б достатньо для першого випадку.
янченко

116

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

Наприклад, вересень:

М -> 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шаблон "MMMM" для січня з російською мовою Locale:

января (що правильно для повного рядка дати: " 10 січня 2014 р. ")

але у випадку окремої назви місяця ви очікували б:

январь

Правильним рішенням є:

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

Якщо вас цікавить, звідки беруться всі переклади - ось посилання на переклади григоріанського календаря (інші календарі, на які посилається вгорі сторінки).


1
'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 років тому, і ці класи давно застаріли. Якщо припустити, що ви ще не на рівні 26 API, я пропоную скористатися бібліотекою ThreeTenABP, яка містить адаптований для Android бекпорт java.time, сучасний API дати та часу Java. java.time набагато приємніше працювати.

Залежно від ваших точних потреб та ситуації є два варіанти:

  1. Використання Monthта його getDisplayNameспосіб.
  2. Використовуйте a 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);

Я демонструю використання 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, що не є Android 6 та 7, отримайте BackTep 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

Зразковий спосіб отримати дату та час у цьому форматі "2018 Nov 01 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;
}

0

Отримайте назву місяця у рядку.

 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. Так набагато приємніше працювати.
Оле В. В.

Чи вносите ви багато, що ще не було найвідповіданішої відповіді Джона?
Оле В. В.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.