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?
java.util.Calendar
e não alguma outraCalendar
classe, certo?Formatter f = new Formatter();
(opcionalmente, você pode fornecer uma localidade) e, em seguida,String monthName = f.format("%tB",c).toString();
ou%tb
para um nome curto.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());
fonte
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())
fonte
"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.getDisplayName
ou o padrão "MMMM" para janeiro com o russoLocale
:января (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).
fonte
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
fonte
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
fonte
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 Мая
fonte
Russo.
Month .MAY .getDisplayName( TextStyle.FULL_STANDALONE , new Locale( "ru" , "RU" ) )
Inglês nos Estados Unidos.
Month .MAY .getDisplayName( TextStyle.FULL_STANDALONE , Locale.US )
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,
Calendar
eGregorianCalendar
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:
Month
e seugetDisplayName
método.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 é:
Em alguns idiomas, fará diferença se você usar
TextStyle.FULL
ouTextStyle.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
DateTimeFormatter
mais 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 aCalendar
classe antiga . O código acima irá trabalhar para umLocalDate
, umLocalDateTime
,MonthDay
,OffsetDateTime
e umYearMonth
também.E se você
Calendar
obtiver um de uma API legada ainda não atualizada para java.time? Converta para aZonedDateTime
e 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 .
org.threeten.bp
com subpacotes.Links
java.time
foi descrito pela primeira vez.java.time
para Java 6 e 7 (ThreeTen para JSR-310).fonte
Eu recomendaria usar o
Calendar
objeto eLocale
como 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
fonte
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);
fonte
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; }
fonte