Як отримати назву місяця з календаря


95

Чи існує один ліній, щоб отримати назву місяця, коли ми знаємо int monthNumber = calendar.get(Calendar.MONTH)? Або який найпростіший спосіб?


3
@anyone_reaching_this_issue: Це питання ( stackoverflow.com/questions/6192781/month-name-as-a-string ) згадує GetDisplayName () і інші intesreting трюки
Poutrathor

Відповіді:


99

Ви також отримаєте цей шлях.

  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 (); month = date.get (Календар.MONTH); System.out.println ("Поточний місяць -" + (місяць + 1) + ", а назва місяця" + getMonthForInt (місяць)); } статичний рядок getMonthForInt (int num) {String month = "неправильно"; DateFormatSymbols dfs = новий DateFormatSymbols (); String [] місяців = dfs.getMonths (); if (num> = 0 && num <= 11) {month = місяці [num]; } місяць повернення; }
Аджай Кумар

192

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

Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));

Це буде працювати, але я хотів би отримати рядок repr. місяця, коли я знаю його індекс. Я думаю, я буду використовувати інші підходи, дякую.
ogzd

47
це допомогло мені отримати назву поточного місяця. хоча я використовував ("MMMM"), щоб отримати повне ім'я місяця замість скороченого.
speedynomads

77

Так просто, як це

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

4
Використання календаря абстракцій - це найелегантніше рішення на мою думку. +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());
Пратік Бутані

це слабке рішення, як щодо січня, фебр тощо, а не січня лютого тощо. Це не охопить усієї ситуації
Abeer zaroor

2
Ну, слід додати 1 на місяць. Масиви починаються з 0.
RoccoDev

це погано, ти знову вигадуєш Java?
Міккі Перлштайн

1
Це працює для англомовних користувачів. Що з іншими?
Адвент S

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 ")

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

январь


Це правильна відповідь для місцевості RU. Дуже дивно, що андроїд SDK не містить специфікацій 'LLLL'.
Анфет

12

Joda-Time

Як щодо використання Joda-Time . Це набагато кращий API часу для роботи з датою (і Januaryтут означає січень. Це не так, як Календар, який використовує 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. Твоє бажання. Але ти обов'язково спробуй, і я, сподіваюся, ти будеш любити його співати.
Rohit Jain

@ogzd. Я розмістив спосіб отримати назву місяця від номера місяця. До речі, навіщо ви хочете це робити?
Rohit Jain

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 App.

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)]


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);

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 - він поверне назву місяця коротко, як січень, пір, березень. MMMM - він поверне повну назву місяця у строковому форматі, як січень.
Аміт Мішра

це єдина ПРАВИЛЬНА відповідь щодо форматування дат. використовувати об’єкт Дата або Календар і відформатувати його за допомогою форматера. само питання - БАД
Міккі Перлштайн

0

Він повертає англійську назву місяця. 04 повертає КВІТЕНЬ тощо.

String englishMonth (int month){
        return Month.of(month);
    }

Проста і пряма пропозиція, дякую. Ваш код не компілюється. Вам потрібно буде оголосити тип повернення Monthабо застосувати toStringдо результату перед його поверненням.
Оле ВВ

-3

від документа java doc 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.