Я намагаюся повернути назву місяця як рядок, наприклад "травень", "вересень", "листопад".
Я намагався:
int month = c.get(Calendar.MONTH);
Однак це повертає цілі числа (5, 9, 11 відповідно). Як я можу отримати назву місяця?
Відповіді:
Використовуйте getDisplayName .
Для попереднього використання API String.format(Locale.US,"%tB",c);
java.util.Calendar
а не якийсь інший Calendar
клас, так?
Formatter f = new Formatter();
(за бажанням ви можете вказати локаль) тоді String monthName = f.format("%tB",c).toString();
або %tb
для короткої назви.
Використовуй це :
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());
Для отримання місяця у змінної рядка використовуйте код нижче
Наприклад, вересень:
М -> 9
ММ -> 09
МММ -> верес
ММММ -> вересень
String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
"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 );
Якщо вас цікавить, звідки беруться всі переклади - ось посилання на переклади григоріанського календаря (інші календарі, на які посилається вгорі сторінки).
Настільки просто, як це
mCalendar = Calendar.getInstance();
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
Calendar.LONG - це отримати повну назву місяця, а Calendar.SHORT коротко вказує назву. Наприклад: Calendar.LONG поверне січень Calendar.SHORT поверне Jan
Я зберігаю цю відповідь, яка корисна для інших випадків, але відповідь @trutheality видається найбільш простим і прямим способом.
Ви можете використовувати DateFormatSymbols
DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
Єдиний спосіб на 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
Результатом за травень є Май, але не Мая
Російський.
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
new Locale( "ru" , "RU" )
)
май
Англійська в США.
Month
.MAY
.getDisplayName(
TextStyle.FULL_STANDALONE ,
Locale.US
)
Може
Перегляньте цей код у прямому ефірі на IdeOne.com .
Ось сучасна відповідь. Коли це питання було задано в 2011 році, Calendar
і GregorianCalendar
зазвичай використовувався для дати і часу , не дивлячись на те, що вони завжди були погано розроблені. Зараз це 8 років тому, і ці класи давно застаріли. Якщо припустити, що ви ще не на рівні 26 API, я пропоную скористатися бібліотекою ThreeTenABP, яка містить адаптований для Android бекпорт java.time, сучасний API дати та часу Java. java.time набагато приємніше працювати.
Залежно від ваших точних потреб та ситуації є два варіанти:
Month
та його getDisplayName
спосіб.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 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. Для цього потрібно лише принаймні Java 6 .
org.threeten.bp
з підпакетами.java.time
було вперше описано.java.time
в Java 6 і 7 (ThreeTen для JSR-310).Я б рекомендував використовувати 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
Зразковий спосіб отримати дату та час у цьому форматі "2018 Nov 01 16:18:22" використовуйте це
DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
Date date = new Date();
dateFormat.format(date);
Отримати автономну назву місяця напрочуд важко виконати "правильно" на 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;
}
Отримайте назву місяця у рядку.
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. Так набагато приємніше працювати.