Nome del mese come stringa


89

Sto cercando di restituire il nome del mese come stringa, ad esempio "maggio", "settembre", "novembre".

Provai:

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

Tuttavia, questo restituisce numeri interi (5, 9, 11, rispettivamente). Come posso ottenere il nome del mese?

Risposte:


88

Usa getDisplayName .

Per l'uso precedente dell'API String.format(Locale.US,"%tB",c);


Ho un problema: getDisplayName (month, Calendar.LONG, Locale.US) ed Eclipse mi dice che Calendar.LONG o Calendar.SHORT non esistono.
Gaby

È molto strano. Stai usando java.util.Calendare non qualche altra Calendarclasse, giusto?
trutheality

sì. Sembra che getDisplayName () e Calendar.LONG e Calendar.SHORT associati siano solo di livello API 9. Quindi, funziona per il livello 9, ma ho bisogno per il livello 7 :(
Gaby

3
Formatter f = new Formatter();(opzionalmente puoi dargli una localizzazione) quindi String monthName = f.format("%tB",c).toString();o %tbper nome breve.
trutheality

5
anche usare Locale.getDefault () invece di Locale.US potrebbe essere una buona idea :)
Shine

159

Usa questo :

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

Il nome del mese conterrà il nome completo del mese, se vuoi il nome del mese breve, usalo

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());

13
"MMMM" sarebbe sufficiente per il primo caso.
yanchenko

114

Per ottenere il mese nella variabile stringa, utilizzare il codice seguente

Ad esempio il mese di settembre:

M -> 9

MM -> 09

MMM -> set

MMMM -> settembre

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())

1
sì, grazie, funziona a meraviglia, in tutte le lingue che uso (francese, inglese, tedesco)
Chrysotribax

45

"MMMM" NON è sicuramente la soluzione giusta (anche se funziona per molte lingue), usa il pattern "LLLL" con SimpleDateFormat

Il supporto per "L" come estensione compatibile con ICU per i nomi dei mesi autonomi è stato aggiunto alla piattaforma Android nel giugno 2010 .

Anche se in inglese non c'è differenza tra la codifica di "MMMM" e "LLLL", dovresti pensare anche ad altre lingue.

Ad esempio, questo è ciò che ottieni, se usi Calendar.getDisplayNameo il modello "MMMM" per gennaio con il russo Locale:

января (che è corretto per una stringa di data completa: " 10 января, 2014 ")

ma nel caso di un nome di mese autonomo ti aspetteresti:

январь

La soluzione giusta è:

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

Se sei interessato a sapere da dove provengono tutte le traduzioni, ecco il riferimento alle traduzioni del calendario gregoriano (altri calendari collegati in cima alla pagina).


'LLLL' è disponibile solo da Java 8, puoi usare 'MMMM' con SimpleDateFormat e funziona perfettamente anche per la versione standalone.
juanheyns

23

Semplice come questo

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

Calendar.LONG serve per ottenere il nome completo del mese e Calendar.SHORT fornisce il nome in breve. Ad esempio: Calendar.LONG restituirà January Calendar.SHORT tornerà Jan


Bella risposta. Stavo impostando il calendario da solo per l'allarme e avevo bisogno di ottenere il nome del mese in seguito. Risposta perfetta Grazie
Ajji

10

Conservo questa risposta che è utile per altri casi, ma la risposta @trutheality sembra essere il modo più semplice e diretto.

È possibile utilizzare DateFormatSymbols

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

5

L'unico modo su Android per ottenere il nome del mese stanalone formattato correttamente per lingue come ucraino, russo, ceco

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

Testato su API 15-25

L'uscita per maggio è Май ma non Мая


3

Russo.

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

май

Inglese negli Stati Uniti.

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

Maggio

Guarda questo codice eseguito dal vivo su IdeOne.com .

ThreeTenABP e java.time

Ecco la risposta moderna. Quando questa domanda è stata posta nel 2011, CalendareGregorianCalendar sono stati comunemente usato per date e orari, anche se erano sempre mal progettati. Sono passati 8 anni e quelle lezioni sono obsolete da tempo. Supponendo che tu non sia ancora al livello API 26, il mio suggerimento è di utilizzare la libreria ThreeTenABP, che contiene un backport adattato per Android di java.time, la moderna API di data e ora Java. java.time è molto più bello con cui lavorare.

A seconda delle esigenze e della situazione esatte, ci sono due opzioni:

  1. Uso Monthe il suo getDisplayNamemetodo.
  2. Usa un file DateTimeFormatter.

Usa mese

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

L'output di questo snippet è:

Maggio

In alcune lingue farà la differenza se usi TextStyle.FULLo TextStyle.FULL_STANDALONE. Dovrai vedere, magari verificare con i tuoi utenti, quale dei due si adatta al tuo contesto.

Usa un DateTimeFormatter

Se hai un appuntamento con o senza ora del giorno, trovo una DateTimeFormatterpiù pratica. Per esempio:

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

Sto mostrando l'uso di a ZonedDateTime, il sostituto più vicino alla vecchia Calendarclasse. Il codice qui sopra lavorare per una LocalDate, una LocalDateTime, MonthDay, OffsetDateTimee YearMonthanche.

Cosa succede se hai ottenuto Calendarda un'API legacy non ancora aggiornata a java.time? Converti in a ZonedDateTimee procedi come sopra:

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

Il resto è lo stesso di prima.

Domanda: java.time non richiede il livello API Android 26?

java.time funziona bene sia sui dispositivi Android più vecchi che su quelli più recenti. Richiede solo almeno Java 6 .

  • In Java 8 e versioni successive e sui dispositivi Android più recenti (dal livello API 26) l'API moderna è integrata.
  • In Java 6 e 7 non Android ottieni il ThreeTen Backport, il backport delle classi moderne (ThreeTen per JSR 310; vedere i collegamenti in fondo).
  • Su Android (meno recenti) utilizzare l'edizione Android di ThreeTen Backport. Si chiama ThreeTenABP. E assicurati di importare le classi di data e ora da org.threeten.bpcon sottopacchetti.

Collegamenti


2

Consiglierei di usare Calendarobject e Localepoiché i nomi dei mesi sono diversi per le diverse lingue:

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

Esempio per il nome completo del mese:

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

Risultato: January

Esempio per il nome del mese breve:

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

Risultato: Jan


2

Un modo di esempio per ottenere la data e l'ora in questo formato "2018 Nov 01 16:18:22" usa questo

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

0

Ottenere un nome di mese autonomo è sorprendentemente difficile da eseguire "correttamente" in Java. (Almeno al momento della stesura di questo articolo. Attualmente sto utilizzando Java 8).

Il problema è che in alcune lingue, tra cui russo e ceco, la versione autonoma del nome del mese è diversa dalla versione "formattazione". Inoltre, sembra che nessuna singola API Java ti darà solo la stringa "migliore". La maggior parte delle risposte pubblicate qui finora offre solo la versione di formattazione. Incollata di seguito è una soluzione funzionante per ottenere la versione standalone del nome di un singolo mese o per ottenere un array con tutti loro.

Spero che questo faccia risparmiare tempo a qualcun altro!

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

0

Ottieni il nome del mese in 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;
}

Utilizzo:

String monthName = getMonthName();

Considera di non usare la SimpleDateFormatclasse e gli amici a lungo antiquati e notoriamente fastidiosi . Verifica se puoi utilizzare desugaring o aggiungere ThreeTenABP al tuo progetto Android, al fine di utilizzare java.time, la moderna API di data e ora di Java. È molto più bello lavorare con.
Ole VV

Stai contribuendo molto che non è già nella risposta più votata da John?
Ole VV
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.