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

97

Есть ли один указатель, чтобы узнать название месяца, когда мы знаем

int monthNumber = calendar.get(Calendar.MONTH)

Или как проще всего?

огзд
источник
3
@anyone_reaching_this_issue: В этом вопросе ( stackoverflow.com/questions/6192781/month-name-as-a-string ) упоминается getDisplayName () и другие интересные уловки
Путратор

Ответы:

101

Вы получите и этот путь.

  String getMonthForInt(int num) {
        String month = "wrong";
        DateFormatSymbols dfs = new DateFormatSymbols();
        String[] months = dfs.getMonths();
        if (num >= 0 && num <= 11 ) {
            month = months[num];
        }
        return month;
    }
субодх
источник
6
Реализация DateFormatSymbols была изменена в JDK 8, поэтому метод getMonths больше не возвращает правильные значения для всех Locale: oracle.com/technetwork/java/javase/…
ahaaman
1
не могли бы вы дать обходной путь / рабочее решение для JDK8?
Доминик
когда вы получите месяц в виде числа?
Микки
Микки, чтобы ответить на ваш вопрос, вот как вы получаете месяц как int и используете его - public static void main (String [] args) {int month; Дата GregorianCalendar = новый GregorianCalendar (); месяц = ​​date.get (Calendar.MONTH); System.out.println («Текущий месяц -« + (месяц + 1) + »и название месяца -« + getMonthForInt (месяц) »); } static String getMonthForInt (int num) {String month = "неверно"; DateFormatSymbols dfs = new DateFormatSymbols (); Строка [] месяцев = dfs.getMonths (); если (число> = 0 && число <= 11) {месяц = ​​месяцы [число]; } месяц возврата; }
Аджай Кумар
194

вы можете добиться этого с помощью SimpleDateFormat , который предназначен для форматирования даты и времени.

Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));
PermGenError
источник
Это сработает, но я хотел бы получить строку repr. месяца, когда я знаю его индекс. Думаю, я воспользуюсь другими подходами, спасибо.
ogzd
48
это помогло мне получить название текущего месяца. хотя я использовал ("MMMM"), чтобы получить полное название месяца вместо сокращенного.
speedynomads 02
79

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

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
сандалон
источник
4
На мой взгляд, использование абстракции Calendar - наиболее элегантное решение. +1
себастьян
2
Неправильно! Проблема будет в языках с падежами. Например, для славянских языков он вернет месяц в родительном падеже, например, для октября в локали ru-RU вы получите октябрявместо Октябрь, чего вы, вероятно, ожидаете.
Ник Сикриер
41

Это решение, которое я придумал для проекта класса:

public static String theMonth(int month){
    String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    return monthNames[month];
}

Номер, который вы передаете, поступает по Calendar.MONTHтелефону.

Терри Черн
источник
2
Это полезно для меняnew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani
это слабое решение, как насчет января, февраля и т. д., а не дополнения к январю, февралю и т. д., это не покрывает всю ситуацию
Abeer zaroor
2
Что ж, вы должны добавить 1 к месяцу. Массивы начинаются с 0.
RoccoDev
1
Это работает для англоговорящих пользователей. А что насчет остальных?
Advait S
1
@MickeyPerlstein Нет. Это не «переизобретать» (как вы выразились) Java. И это тоже неплохо. Это просто способ сделать это. Кроме того, это основано на том, что вам не нужно использовать класс Calendar (или, по крайней мере, вам не нужно его использовать - хотя, если вам нужен текущий месяц, возможно, так), что может быть желательно в некоторых случаях. Конечно, это только для английского, но не в этом дело.
Прифтан,
33

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

вот пример отображения названия месяца на английском, французском, арабском и арабском языках в конкретной стране, такой как «Сирия»:

    Calendar c = Calendar.getInstance();
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH ) );
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.FRANCE ) );
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, new Locale("ar") ) );
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, new Locale("ar", "SY") ) );
    System.out.println(c.getTime().toString());

результат:

  January
  janvier
  يناير
  كانون الثاني
  Sat Jan 17 19:31:30 EET 2015
Англ. Самер Т
источник
Какая это версия java?
Мухаммад Гелбана
16
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );

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

Вот что вы получите, если используете getDisplayNameот Calendarили DateFormatSymbolsдля января:

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

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

январь

artkoenig
источник
Это правильный ответ для локали RU. Очень странно, что этот Android SDK не содержит спецификации LLLL.
Anfet
12

Джода-Тайм

Как насчет использования Joda-Time . Это гораздо лучший API для работы с датой и временем ( Januaryздесь имеется в виду январь. Это не похоже на Calendar, который использует 0-basedиндекс для месяцев).

Вы можете использовать AbstractDateTime#toString( pattern )метод для форматирования даты в указанном формате:

DateTime date = DateTime.now();
String month = date.toString("MMM");

Название месяца из числа

Если вам нужно название месяца для определенного номера месяца, вы можете сделать это следующим образом:

int month = 3;
String monthName = DateTime.now().withMonthOfYear(month).toString("MMM");

Локализовать

Приведенный выше подход использует текущий языковой стандарт JVM по умолчанию для языка названия месяца. Вместо этого вы хотите указать объект Locale.

String month = date.toString( "MMM", Locale.CANADA_FRENCH );
Рохит Джайн
источник
1
спасибо но я доволен своим старым SimpleDateFormatиDate
ogzd
@ogzd. Твое желание. Но вам обязательно стоит попробовать, и я уверен, вам понравится ее спеть.
Рохит Джайн
@ogzd. Я опубликовал способ получить название месяца из номера месяца. Кстати, зачем вам это делать?
Рохит Джайн
10

Month::getDisplayName

Начиная с Java 8 используйте Monthenum. getDisplayNameМетод автоматически локализует название месяца.

Проходят:

  • A, TextStyleчтобы определить, как долго или как сокращено.
  • A, Localeчтобы указать человеческий язык, используемый при переводе, и культурные нормы, используемые для сокращений, пунктуации и т. Д.

Пример:

public static String getMonthStandaloneName(Month month) {
    return month.getDisplayName(
        TextStyle.FULL_STANDALONE, 
        Locale.getDefault()
    );
}
Николай Федоровских
источник
9

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

String month = new DateFormatSymbols().getMonths()[monthNumber - 1];

или для коротких имен

String month = new DateFormatSymbols().getShortMonths()[monthNumber - 1];

Имейте monthNumberв виду, что вы начинаете отсчет с 1, в то время как любой из вышеперечисленных методов возвращает массив, поэтому вам нужно начать отсчет с 0.

Жорж
источник
3

Этот код имеет языковую поддержку. Я использовал их в приложении для Android.

String[] mons = new DateFormatSymbols().getShortMonths();//Jan,Feb,Mar,... 

String[] months = new DateFormatSymbols().getMonths();//January,Februaty,March,...
Самет ЁЗТОПРАК
источник
1
Это работает отлично, хотя комментарии немного неверны
Иво Недев
3

Мне это показалось намного проще ( https://docs.oracle.com/javase/tutorial/datetime/iso/enum.html )

private void getCalendarMonth(Date date) {      
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    Month month = Month.of(calendar.get(Calendar.MONTH));       
    Locale locale = Locale.getDefault();
    System.out.println(month.getDisplayName(TextStyle.FULL, locale));
    System.out.println(month.getDisplayName(TextStyle.NARROW, locale));
    System.out.println(month.getDisplayName(TextStyle.SHORT, locale));
}
ДжибинНаджиб
источник
не Monthначинает свой индекс с января = 1, тогда как календарь начинается с января = 0? Не Month.of(calendar.get(Calendar.MONTH));подведет в случае января?
MCO
2

Вы можете получить это одной строкой вот так: String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]

Whirvis
источник
2

Это работает для меня:

String getMonthName(int monthNumber) {
    String[] months = new DateFormatSymbols().getMonths();
    int n = monthNumber-1;
    return (n >= 0 && n <= 11) ? months[n] : "wrong number";
}

Чтобы вернуться "September"с одной строкой:

String month = getMonthName(9);
jhpg
источник
2

В одну сторону:

У нас есть MonthAPI на Java ( java.time.Month). Мы можем получить, используяMonth.of(month);

Здесь Monthони проиндексированы как числа, поэтому вы можете указать Month.JANUARYили указать индекс в указанном выше API, например 1, 2, 3, 4.

Второй способ:

ZonedDateTime.now().getMonth();

Это доступно в формате java.time.ZonedDateTime.

Кушал Балдев
источник
1

Я создал расширение kotlin на основе ответов в этой теме и, используя ответы DateFormatSymbols, вы получите локализованный ответ.

fun Date.toCalendar(): Calendar {
    val calendar = Calendar.getInstance()
    calendar.time = this
    return calendar
}


fun Date.getMonthName(): String {
    val month = toCalendar()[Calendar.MONTH]
    val dfs = DateFormatSymbols()
    val months = dfs.months
    return months[month]
}
Фелипе Кастильос
источник
1

Это сработало для меня

        import java.text.SimpleDateFormat;
        import java.util.Calendar;


        Calendar cal = Calendar.getInstance();
        String currentdate=new SimpleDateFormat("dd-MMM").format(cal.getTime());
Махадев Гауда
источник
0
DateFormat date =  new SimpleDateFormat("dd/MMM/yyyy");
Date date1 = new Date();
System.out.println(date.format(date1));
Амит Мишра
источник
1
Хотя ваш ответ может быть правильным, он плохого качества. Пожалуйста, поясните, почему этот ответ правильный.
SubliemeSiem
1
@SubliemeSiem Я просто пытаюсь изменить формат и самый простой способ сделать это: MM - он вернет название месяца в целых числах, например 01, 02, 03. MMM - он вернет название месяца вкратце, например, jan, feb, mar. MMMM - возвращает полное название месяца в строковом формате, например, январь.
Амит Мишра
это единственный ПРАВИЛЬНЫЙ ответ для форматирования дат. используйте объект Date или Calendar и отформатируйте его с помощью средства форматирования. вопрос сам по себе ПЛОХОЙ
Микки
0

Возвращает английское название месяца. 04 возвращает АПРЕЛЬ и так далее.

String englishMonth (int month){
        return Month.of(month);
    }
mxhc
источник
Простое и прямое предложение, спасибо. Ваш код не компилируется. Вам нужно будет либо объявить тип возвращаемого значения, Monthлибо применить toStringк результату перед его возвратом.
Ole VV
-3

из java-документа SimpleDateFormat:

*         <td><code>"yyyyy.MMMMM.dd GGG hh:mm aaa"</code>
 *         <td><code>02001.July.04 AD 12:08 PM</code>
 *         <td><code>"EEE, d MMM yyyy HH:mm:ss Z"</code>
 *         <td><code>Wed, 4 Jul 2001 12:08:56 -0700</code>
Рафаэль Санчес
источник
Я не понимаю, как это ответить на заданный вопрос.
jhpg