Nombre del mes como una cadena

89

Estoy intentando devolver el nombre del mes como una cadena, por ejemplo, "mayo", "septiembre", "noviembre".

Lo intenté:

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

Sin embargo, esto devuelve números enteros (5, 9, 11, respectivamente). ¿Cómo puedo obtener el nombre del mes?

Callejear
fuente

Respuestas:

88

Utilice getDisplayName .

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

veracidad
fuente
Tengo un problema: getDisplayName (mes, Calendar.LONG, Locale.US) Y Eclipse me dice Calendar.LONG o Calendar.SHORT no existen.
Gaby
Eso es muy extraño. Estás usando java.util.Calendary no otra Calendarclase, ¿verdad?
Verdad
si. Parece que getDisplayName () y Calendar.LONG y Calendar.SHORT asociados son solo de nivel de API 9. Entonces, funciona para el nivel 9, pero necesito el nivel 7 :(
Gaby
3
Formatter f = new Formatter();(opcionalmente, puede asignarle una configuración regional) luego String monthName = f.format("%tB",c).toString();o %tbcomo nombre corto.
Verdad
5
también usar Locale.getDefault () en lugar de Locale.US podría ser una buena idea :)
Shine
159

Utilizar esta :

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

El nombre del mes contendrá el nombre completo del mes, si desea un nombre corto del mes, use este

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());
Juan
fuente
13
"MMMM" sería suficiente para el primer caso.
Yanchenko
115

Para obtener el mes en la variable de cadena, use el siguiente código

Por ejemplo el mes de septiembre:

M -> 9

MM -> 09

MMM -> septiembre

MMMM -> septiembre

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
Arun Antoney
fuente
1
sí, gracias, funciona como un encanto, en todos los idiomas que uso (francés, inglés, alemán)
Chrysotribax
45

"MMMM" definitivamente NO es la solución correcta (incluso si funciona para muchos idiomas), use el patrón "LLLL" con SimpleDateFormat

La compatibilidad con 'L' como extensión compatible con ICU para nombres de meses independientes se agregó a la plataforma Android en junio de 2010 .

Incluso si en inglés no hay diferencia entre la codificación por 'MMMM' y 'LLLL', también debería pensar en otros idiomas.

Por ejemplo, esto es lo que obtiene, si usa Calendar.getDisplayNameo el patrón "MMMM" para enero con el ruso Locale:

января (que es correcto para una cadena de fecha completa: " 10 января, 2014 ")

pero en el caso de un nombre de mes independiente, esperaría:

январь

La solución correcta es:

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

Si está interesado en el origen de todas las traducciones, aquí está la referencia a las traducciones del calendario gregoriano (otros calendarios vinculados en la parte superior de la página).

artkoenig
fuente
'LLLL' solo está disponible desde Java 8, puede usar 'MMMM' con SimpleDateFormat y también funciona perfectamente para la versión independiente.
juanheyns
para ser claros, en ruso la traducción de "Января" es el caso genitivo, que significa "de enero", mientras que "Январь" es nominativo, que significa simplemente "enero". puede haber otros idiomas eslavos con esta distinción, como el ucraniano y el serbio. Es solo gramatical y, por lo general, no es demasiado importante. Pero los casos de uso dados en esta respuesta son gramaticalmente correctos: use MMMM para fechas completas y LLLL cuando muestre el mes solo si desea ser lo más correcto posible.
moonlightcheese hace
23

Tan simple como esto

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

Calendar.LONG es para obtener el nombre completo del mes y Calendar.SHORT da el nombre brevemente. Por ejemplo: Calendar.LONG devolverá enero Calendar.SHORT devolverá enero

sandalias
fuente
Gran respuesta. Estaba configurando el calendario por mí mismo para la alarma y necesitaba obtener el nombre del mes más tarde. Respuesta perfecta Gracias
Ajji
10

Guardo esta respuesta que es útil para otros casos, pero la respuesta de @trutheality parece ser la forma más simple y directa.

Puede utilizar DateFormatSymbols

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

La única forma en Android de obtener un nombre de mes estándar correctamente formateado para idiomas como ucraniano, ruso, checo

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

Probado en API 15-25

La producción de mayo es Май pero no Мая

Dmytro
fuente
3

Ruso.

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

май

Inglés en los Estados Unidos.

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

Mayo

Vea este código en vivo en IdeOne.com .

ThreeTenABP y java.time

Aquí está la respuesta moderna. Cuando esta pregunta se hizo en 2011, Calendary GregorianCalendarse utiliza comúnmente para fechas y horas a pesar de que siempre estaban mal diseñados. Eso es hace ahora 8 años, y esas clases están desactualizadas desde hace mucho tiempo. Suponiendo que aún no está en el nivel de API 26, mi sugerencia es usar la biblioteca ThreeTenABP, que contiene un backport adaptado a Android de java.time, la API moderna de fecha y hora de Java. java.time es mucho más agradable para trabajar.

Dependiendo de sus necesidades y situación exactas, hay dos opciones:

  1. Uso Monthy su getDisplayNamemétodo.
  2. Utilice un DateTimeFormatter.

Mes de uso

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

El resultado de este fragmento es:

Mayo

En algunos idiomas marcará la diferencia si usa TextStyle.FULLo TextStyle.FULL_STANDALONE. Tendrá que ver, tal vez consultar con sus usuarios, cuál de los dos encaja en su contexto.

Utilice un DateTimeFormatter

Si tienes una cita con o sin hora del día, encuentro una DateTimeFormattermás práctica. Por ejemplo:

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

Estoy mostrando el uso de a ZonedDateTime, el reemplazo más cercano a la Calendarclase anterior. El código anterior funcionará durante un LocalDate, una LocalDateTime, MonthDay, OffsetDateTimey una YearMonthtambién.

¿Qué Calendarsucede si obtiene una API heredada que aún no se actualizó a java.time? Convierta a ZonedDateTimeay proceda como arriba:

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

El resto es igual que antes.

Pregunta: ¿Java.time no requiere el nivel 26 de API de Android?

java.time funciona bien tanto en dispositivos Android antiguos como nuevos. Solo requiere al menos Java 6 .

  • En Java 8 y versiones posteriores y en los dispositivos Android más nuevos (desde el nivel de API 26), la API moderna viene incorporada.
  • En Java 6 y 7 que no son de Android, obtenga ThreeTen Backport, el backport de las clases modernas (ThreeTen para JSR 310; consulte los enlaces en la parte inferior).
  • En Android (más antiguo), use la edición de Android de ThreeTen Backport. Se llama ThreeTenABP. Y asegúrese de importar las clases de fecha y hora desde org.threeten.bpcon subpaquetes.

Enlaces

Ole VV
fuente
2

Recomendaría usar Calendarobjeto y Localedado que los nombres de los meses son diferentes para diferentes idiomas:

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

Ejemplo de nombre de mes completo:

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

Resultado: January

Ejemplo de nombre de mes corto:

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

Resultado: Jan

Ayaz Alifov
fuente
2

Una forma de muestra de obtener la fecha y la hora en este formato "2018 Nov 01 16:18:22" usa esto

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

Obtener un nombre de mes independiente es sorprendentemente difícil de realizar "correctamente" en Java. (Al menos en el momento de escribir este artículo. Actualmente estoy usando Java 8).

El problema es que en algunos idiomas, incluidos el ruso y el checo, la versión independiente del nombre del mes es diferente de la versión de "formato". Además, parece que ninguna API de Java le proporcionará la "mejor" cadena. La mayoría de las respuestas publicadas aquí hasta ahora solo ofrecen la versión de formato. A continuación, se encuentra una solución funcional para obtener la versión independiente de un solo nombre de mes, o obtener una matriz con todos ellos.

¡Espero que esto le ahorre tiempo a alguien más!

/**
 * 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
fuente
0

Obtenga el nombre del mes en String.

 private String getMonthName() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
    String month_name = month_date.format(cal.getTime());
    return month_name;
}

Uso:

String monthName = getMonthName();
Zeeshan Ali
fuente
Considere no utilizar la SimpleDateFormatclase y los amigos pasados ​​de moda y notoriamente problemáticos . Vea si puede usar desugaring o agregar ThreeTenABP a su proyecto de Android, para usar java.time, la API moderna de fecha y hora de Java. Es mucho más agradable trabajar con él.
Ole VV
¿Está contribuyendo mucho que no está ya en la respuesta más votada por John?
Ole VV