Como obter o nome do mês do calendário

95

Existe um oneliner para obter o nome do mês quando sabemos int monthNumber = calendar.get(Calendar.MONTH)? Ou qual é a maneira mais fácil?

ogzd
fonte
3
@anyone_reaching_this_issue: Esta questão ( stackoverflow.com/questions/6192781/month-name-as-a-string ) menciona getDisplayName () e outros truques
intesreting

Respostas:

99

Você também vai conseguir assim.

  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;
    }
subodh
fonte
6
A implementação de DateFormatSymbols foi alterada no JDK 8, então o método getMonths não retorna mais os valores corretos para todos os Locale's: oracle.com/technetwork/java/javase/…
ahaaman de
1
você poderia fornecer uma solução alternativa / funcional para o JDK8?
Dominik
quando você obteria um mês como um número?
Mickey Perlstein
Mickey para responder à sua pergunta, aqui está como você pega o mês como int e o usa - public static void main (String [] args) {int mês; GregorianCalendar data = novo GregorianCalendar (); mês = date.get (Calendar.MONTH); System.out.println ("O mês atual é" + (mês + 1) + "e o nome do mês é" + getMonthForInt (mês)); } static String getMonthForInt (int num) {String mês = "errado"; DateFormatSymbols dfs = new DateFormatSymbols (); String [] meses = dfs.getMonths (); if (num> = 0 && num <= 11) {mês = meses [num]; } mês de retorno; }
Ajay Kumar
192

você pode obtê- lo usando SimpleDateFormat , que visa formatar datas e horas.

Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));
PermGenError
fonte
Isso vai funcionar, mas eu gostaria de obter a string repr. do mês em que sei o índice disso. Acho que vou usar as outras abordagens, obrigado.
ogzd
47
isso me ajudou a obter o nome do mês atual. embora eu tenha usado ("MMMM") para obter o nome completo do mês em vez de um abreviado.
speedynomads de
77

Tão simples quanto isso

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
sandalone
fonte
4
O uso da abstração do Calendário é a solução mais elegante na minha opinião. +1
sebastian
2
Errado! O problema estará em idiomas com caixas. Por exemplo, em localidades eslavas, ele retornará mês em caso genitivo, por exemplo, para outubro em localidade ru-RU você receberá em октябряvez de Октябрь, o que você provavelmente espera.
Nick Sikrier
41

Esta é a solução que encontrei para um projeto de classe:

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

O número que você passa vem de uma Calendar.MONTHchamada.

Terry Chern
fonte
2
Isso é útil para mimnew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani
esta é uma solução fraca, que tal janeiro, fevereiro etc. não além de janeiro, fevereiro etc. isso não cobrirá toda a situação
Abeer zaroor
2
Bem, você deve adicionar 1 ao mês. As matrizes começam em 0.
RoccoDev
isso é ruim, você está reinventando o java?
Mickey Perlstein
1
Isso funciona para usuários que falam inglês. E quanto aos outros?
Advait S
33

se você tiver uma interface multilíngue, poderá usar getDisplayName para exibir o nome do mês com controle do idioma de exibição.

aqui está um exemplo de exibição do nome do mês em inglês, francês, árabe e árabe em um país específico, como "Síria":

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

o resultado é:

  January
  janvier
  يناير
  كانون الثاني
  Sat Jan 17 19:31:30 EET 2015
Eng. Samer T
fonte
Qual versão java é essa?
Muhammad Gelbana
16
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );

Para alguns idiomas (por exemplo, russo), esta é a única maneira correta de obter os nomes dos meses independentes.

Isso é o que você obtém, se usar getDisplayNamedo CalendarouDateFormatSymbols para janeiro:

января (que é correto para uma string de data completa: " 10 января, 2014 ")

mas no caso de um nome de mês independente, você esperaria:

январь

Artkoenig
fonte
É uma resposta correta para a localidade RU. Muito estranho que o Android SDK não contenha especificações 'LLLL'.
Anfet
12

Joda-Time

Que tal usar o Joda-Time . É uma API de data e hora muito melhor para trabalhar (e Januarysignifica janeiro aqui. Não é como o Agenda, que usa0-based índice por meses).

Você pode usar o AbstractDateTime#toString( pattern )método para formatar a data no formato especificado:

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

Nome do mês a partir do número

Se quiser o nome do mês para um determinado número de mês, você pode fazer assim:

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

Localizar

A abordagem acima usa o Locale padrão atual da JVM para o idioma do nome do mês. Em vez disso, você deseja especificar um objeto Locale.

String month = date.toString( "MMM", Locale.CANADA_FRENCH );
Rohit Jain
fonte
1
obrigado, mas estou feliz com meu velho SimpleDateFormateDate
ogzd
@ogzd. Seu desejo. Mas com certeza você deve tentar, e aposto que vai adorar cantá-la.
Rohit Jain
@ogzd. Eu postei a maneira de obter o nome do mês a partir do número do mês. BTW, por que você quer fazer isso?
Rohit Jain
10

Month::getDisplayName

Desde o Java 8, use o Monthenum. O getDisplayNamemétodo localiza automaticamente o nome do mês.

Passar:

  • A TextStylepara determinar por quanto tempo ou abreviações.
  • A Localepara especificar a linguagem humana usada na tradução e as normas culturais usadas para abreviações, pontuação, etc.

Exemplo:

public static String getMonthStandaloneName(Month month) {
    return month.getDisplayName(
        TextStyle.FULL_STANDALONE, 
        Locale.getDefault()
    );
}
Nikolay Fedorovskikh
fonte
9

Pode ser uma pergunta antiga, mas como uma linha para obter o nome do mês em que sabemos os índices, usei

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

ou para nomes curtos

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

monthNumberEsteja ciente de que você começa a contar a partir de 1 enquanto qualquer um dos métodos acima retorna uma matriz, então você precisa começar a contar a partir de 0.

Georger
fonte
3

Este código possui suporte a idiomas. Eu os usei no aplicativo Android.

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

String[] months = new DateFormatSymbols().getMonths();//January,Februaty,March,...
Samet ÖZTOPRAK
fonte
1
Isso funciona perfeitamente, embora os comentários estejam um pouco completamente errados
Иво Недев
3

Achei muito mais fácil ( 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));
}
JibinNajeeb
fonte
não Monthinicia seu índice com janeiro = 1, enquanto o Calendário começa com janeiro = 0? Não Month.of(calendar.get(Calendar.MONTH));falharia no caso de janeiro?
MCO
2

Você pode obter uma linha como esta: String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]

Whirvis
fonte
2

Isso funciona para mim:

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

Para retornar "September"com uma linha:

String month = getMonthName(9);
jhpg
fonte
2

Mão única:

Temos MonthAPI em Java ( java.time.Month). Podemos usarMonth.of(month);

Aqui, Monthsão indexados como números, portanto, você pode fornecer por Month.JANUARYou fornecer um índice na API acima, como 1, 2, 3, 4.

Segunda forma:

ZonedDateTime.now().getMonth();

Disponível em java.time.ZonedDateTime.

Kushal Baldev
fonte
1

Criei uma extensão kotlin com base nas respostas deste tópico e, usando as respostas DateFormatSymbols, você obtém uma resposta localizada.

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]
}
Felipe castilhos
fonte
1

Isso funcionou para mim

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


        Calendar cal = Calendar.getInstance();
        String currentdate=new SimpleDateFormat("dd-MMM").format(cal.getTime());
mahadev gouda
fonte
0
DateFormat date =  new SimpleDateFormat("dd/MMM/yyyy");
Date date1 = new Date();
System.out.println(date.format(date1));
Amit Mishra
fonte
1
Embora sua resposta possa estar correta, ela é de má qualidade. Explique por que essa resposta está correta.
SubliemeSiem,
1
@SubliemeSiem Estou apenas tentando mudar o formato e a maneira mais simples de fazer isso: MM- retornará o nome do mês em um inteiro como 01, 02, 03. MMM-retornará o nome do mês abreviado como jan, fev, mar. MMMM-ele retornará o nome completo do mês em formato de string como janeiro.
Amit Mishra,
esta é a única resposta CORRETA para a formatação de datas. use um objeto Date ou Calendar e formate-o com um formatador. a pergunta em si é RUIM
Mickey Perlstein
0

Ele retorna o nome do mês em inglês. 04 retorna APRIL e assim por diante.

String englishMonth (int month){
        return Month.of(month);
    }
mxhc
fonte
Sugestão simples e direta, obrigado. Seu código não compila. Você terá que declarar o tipo de retorno Monthou aplicar toStringao resultado antes de devolvê-lo.
Ole VV
-3

do documento 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>
Rafael Sanches
fonte
Não consigo ver como isso responde à pergunta feita.
jhpg