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?
java.util.Calendar
y no otraCalendar
clase, ¿verdad?Formatter f = new Formatter();
(opcionalmente, puede asignarle una configuración regional) luegoString monthName = f.format("%tB",c).toString();
o%tb
como nombre corto.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());
fuente
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())
fuente
"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.getDisplayName
o el patrón "MMMM" para enero con el rusoLocale
:января (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).
fuente
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
fuente
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
fuente
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 Мая
fuente
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 )
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,
Calendar
yGregorianCalendar
se 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:
Month
y sugetDisplayName
método.DateTimeFormatter
.Mes de uso
El resultado de este fragmento es:
En algunos idiomas marcará la diferencia si usa
TextStyle.FULL
oTextStyle.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
DateTimeFormatter
má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 laCalendar
clase anterior. El código anterior funcionará durante unLocalDate
, unaLocalDateTime
,MonthDay
,OffsetDateTime
y unaYearMonth
también.¿Qué
Calendar
sucede si obtiene una API heredada que aún no se actualizó a java.time? Convierta aZonedDateTime
ay 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 .
org.threeten.bp
con subpaquetes.Enlaces
java.time
se describió por primera vez.java.time
Java 6 y 7 (ThreeTen para JSR-310).fuente
Recomendaría usar
Calendar
objeto yLocale
dado 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
fuente
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);
fuente
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; }
fuente
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();
fuente
SimpleDateFormat
clase 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.