Nome do mês como uma string

91

Estou tentando retornar o nome do mês como uma string, por exemplo "maio", "setembro", "novembro".

Eu tentei:

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

No entanto, isso retorna números inteiros (5, 9, 11, respectivamente). Como posso obter o nome do mês?

Gaby
fonte

Respostas:

88

Use getDisplayName .

Para uso de APIs anteriores String.format(Locale.US,"%tB",c);

veracidade
fonte
Eu tenho um problema: getDisplayName (month, Calendar.LONG, Locale.US) E o Eclipse está me dizendo que Calendar.LONG ou Calendar.SHORT não existe.
Gaby
Isso é muito estranho. Você está usando java.util.Calendare não alguma outra Calendarclasse, certo?
verdade
sim. Parece que getDisplayName () e Calendar.LONG e Calendar.SHORT associados são API de nível 9 apenas. Então, funciona para o nível 9, mas eu preciso para o nível 7 :(
Gaby
3
Formatter f = new Formatter();(opcionalmente, você pode fornecer uma localidade) e, em seguida, String monthName = f.format("%tB",c).toString();ou %tbpara um nome curto.
verdade
5
também usar Locale.getDefault () em vez de Locale.US pode ser uma boa ideia :)
Shine
163

Usa isto :

Calendar cal=Calendar.getInstance();
SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
String month_name = month_date.format(cal.getTime());

O nome do mês conterá o nome completo do mês ,, se você quiser um nome curto do mês, use este

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());
John
fonte
13
"MMMM" seria suficiente para o primeiro caso.
yanchenko
119

Para obter mês na variável string, use o código abaixo

Por exemplo, o mês de setembro:

M -> 9

MM -> 09

MMM -> Set

MMMM -> setembro

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
Arun Antoney
fonte
1
sim, obrigado, funciona perfeitamente, em todos os idiomas que uso (francês, inglês, alemão)
Chrysotribax
46

"MMMM" definitivamente NÃO é a solução certa (mesmo que funcione para muitos idiomas), use o padrão "LLLL" com SimpleDateFormat

O suporte para 'L' como extensão compatível com ICU para nomes de meses independentes foi adicionado à plataforma Android em junho de 2010 .

Mesmo que em inglês não haja diferença entre a codificação por 'MMMM' e 'LLLL', você também deve pensar em outros idiomas.

Por exemplo, isto é o que você obtém, se usar Calendar.getDisplayNameou o padrão "MMMM" para janeiro com o russo Locale:

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

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

январь

A solução certa é:

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

Se você está interessado em saber de onde vêm todas as traduções - aqui está a referência às traduções do calendário gregoriano (outros calendários com links no topo da página).

Artkoenig
fonte
1
'LLLL' está disponível apenas a partir do Java 8, você pode usar 'MMMM' com SimpleDateFormat e funciona perfeitamente bem para a versão autônoma também.
juanheyns de
para ser claro, em russo a tradução de "Января" é o caso genitivo, significando "de janeiro", enquanto "Январь" é nominativo, significando apenas "janeiro". pode haver outras línguas eslavas com esta distinção, como ucraniano e sérvio. É apenas gramatical e geralmente não é muito importante. Mas os casos de uso fornecidos nesta resposta são gramaticalmente corretos: use MMMM para datas completas e LLLL ao exibir o mês sozinho, se quiser ser o mais correto possível.
moonlightcheese
obrigado, eu estava lutando com o caso da
língua
26

Tão simples quanto isso

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

Calendar.LONG é obter o nome completo do mês e Calendar.SHORT fornece o nome abreviado. Por exemplo: Calendar.LONG retornará janeiro Calendar.SHORT retornará janeiro

sandalone
fonte
Ótima resposta. Eu estava configurando o calendário sozinho para alarme e precisava obter o nome do mês mais tarde. Resposta perfeita. Obrigado
Ajji
10

Guardo esta resposta que é útil para outros casos, mas a resposta @trutheality parece ser a forma mais simples e direta.

Você pode usar DateFormatSymbols

DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example
MByD
fonte
5

A única maneira no Android de obter o nome do mês stanalone formatado corretamente para idiomas como ucraniano, russo, tcheco

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

Testado em API 15-25

A produção de maio é Май, mas não Мая

Dmytro
fonte
3

Russo.

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    new Locale( "ru" , "RU" )
)

май

Inglês nos Estados Unidos.

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    Locale.US
)

Maio

Veja este código executado ao vivo em IdeOne.com .

ThreeTenABP e java.time

Aqui está a resposta moderna. Quando esta pergunta foi feita em 2011, CalendareGregorianCalendar era comumente usada para datas e horas, embora fossem sempre mal elaborados. Isso foi há 8 anos, e essas aulas estão muito desatualizadas. Supondo que você ainda não esteja no nível de API 26, minha sugestão é usar a biblioteca ThreeTenABP, que contém um backport adaptado para Android de java.time, a moderna API Java de data e hora. java.time é muito mais agradável de trabalhar.

Dependendo de suas necessidades e situação exatas, há duas opções:

  1. Uso Monthe seu getDisplayNamemétodo.
  2. Use um DateTimeFormatter.

Mês de uso

    Locale desiredLanguage = Locale.ENGLISH;
    Month m = Month.MAY;
    String monthName = m.getDisplayName(TextStyle.FULL, desiredLanguage);
    System.out.println(monthName);

A saída deste snippet é:

Maio

Em alguns idiomas, fará diferença se você usar TextStyle.FULLou TextStyle.FULL_STANDALONE. Você terá que ver, talvez verificar com seus usuários, qual dos dois se encaixa em seu contexto.

Use um DateTimeFormatter

Se você tem um encontro com ou sem hora do dia, procuro um DateTimeFormattermais prático. Por exemplo:

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

Estou mostrando o uso de um ZonedDateTime, o substituto mais próximo para a Calendarclasse antiga . O código acima irá trabalhar para um LocalDate, um LocalDateTime, MonthDay, OffsetDateTimee um YearMonthtambém.

E se você Calendarobtiver um de uma API legada ainda não atualizada para java.time? Converta para a ZonedDateTimee proceda como acima:

    Calendar c = getCalendarFromLegacyApi();
    ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);

O resto é o mesmo de antes.

Pergunta: java.time não requer Android API nível 26?

java.time funciona bem em dispositivos Android mais antigos e mais recentes. Requer apenas pelo menos Java 6 .

  • No Java 8 e posterior e em dispositivos Android mais recentes (da API de nível 26), a API moderna vem embutida.
  • Em Java 6 e 7 não Android, obtenha o Backport ThreeTen, o backport das classes modernas (ThreeTen para JSR 310; consulte os links na parte inferior).
  • No Android (mais antigo), use a edição Android do ThreeTen Backport. É chamado de ThreeTenABP. E certifique-se de importar as classes de data e hora org.threeten.bpcom subpacotes.

Links

Ole VV
fonte
2

Eu recomendaria usar o Calendarobjeto e Localecomo os nomes dos meses são diferentes para idiomas diferentes:

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

Exemplo para o nome completo do mês:

System.out.println(getMonthName(0, Locale.US, false));

Resultado: January

Exemplo de nome curto para o mês:

System.out.println(getMonthName(0, Locale.US, true));

Resultado: Jan

Ayaz Alifov
fonte
2

Uma forma de obter a data e a hora neste formato "2018 01 de novembro 16:18:22" use isso

DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
        Date date = new Date();
         dateFormat.format(date);
Mudassir Khan
fonte
0

Obter um nome de mês autônomo é surpreendentemente difícil de executar "corretamente" em Java. (Pelo menos no momento da redação deste artigo. Atualmente, estou usando o Java 8).

O problema é que em alguns idiomas, incluindo russo e tcheco, a versão independente do nome do mês é diferente da versão de "formatação". Além disso, parece que nenhuma API Java só fornecerá a "melhor" string. A maioria das respostas postadas aqui até agora oferece apenas a versão de formatação. Colado abaixo está uma solução de trabalho para obter a versão autônoma de um único nome de mês ou obter um array com todos eles.

Espero que isso poupe mais alguém algum tempo!

/**
 * 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;
}
BlakeTNC
fonte