Monatsname als Zeichenfolge

87

Ich versuche, den Namen des Monats als Zeichenfolge zurückzugeben, z. B. "Mai", "September", "November".

Ich habe es versucht:

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

Dies gibt jedoch ganze Zahlen zurück (5, 9 bzw. 11). Wie kann ich den Monatsnamen erhalten?

Gaby
quelle

Antworten:

88

Verwenden Sie getDisplayName .

Für frühere APIs String.format(Locale.US,"%tB",c);

Wahrhaftigkeit
quelle
Ich habe ein Problem: getDisplayName (Monat, Calendar.LONG, Locale.US) Und Eclipse teilt mir mit, dass Calendar.LONG oder Calendar.SHORT nicht vorhanden sind.
Gaby
Das ist sehr seltsam. Du benutzt java.util.Calendarund keine andere CalendarKlasse, oder?
Wahrhaftigkeit
Ja. Es sieht so aus, als ob getDisplayName () und zugehörige Calendar.LONG und Calendar.SHORT nur API-Level 9 sind. Also, es funktioniert für Level 9, aber ich brauche für Level 7 :(
Gaby
3
Formatter f = new Formatter();(optional können Sie ihm ein Gebietsschema geben) dann String monthName = f.format("%tB",c).toString();oder %tbfür Kurznamen.
Wahrhaftigkeit
5
Auch die Verwendung von Locale.getDefault () anstelle von Locale.US könnte eine gute Idee sein :)
Shine
157

Benutze das :

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

Der Monatsname enthält den vollständigen Monatsnamen. Wenn Sie einen kurzen Monatsnamen wünschen, verwenden Sie diesen

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());
John
quelle
13
"MMMM" würde für den ersten Fall ausreichen.
Yanchenko
113

Verwenden Sie den folgenden Code, um den Monat in der Zeichenfolgenvariablen abzurufen

Zum Beispiel den Monat September:

M -> 9

MM -> 09

MMM -> Sep.

MMMM -> September

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())
Arun Antoney
quelle
1
Ja, danke, es funktioniert wie ein Zauber, in allen Sprachen, die ich benutze (Französisch, Englisch, Deutsch)
Chrysotribax
45

"MMMM" ist definitiv NICHT die richtige Lösung (auch wenn es für viele Sprachen funktioniert), verwenden Sie das "LLLL" -Muster mit SimpleDateFormat

Die Unterstützung für 'L' als ICU-kompatible Erweiterung für eigenständige Monatsnamen wurde im Juni 2010 zur Android-Plattform hinzugefügt .

Auch wenn es auf Englisch keinen Unterschied zwischen der Codierung durch 'MMMM' und 'LLLL' gibt, sollten Sie auch an andere Sprachen denken.

ZB ist dies, was Sie erhalten, wenn Sie Calendar.getDisplayNamedas "MMMM" -Muster für Januar mit dem Russen verwenden Locale:

января (was für eine vollständige Datumszeichenfolge korrekt ist: " 10 января, 2014 ")

Im Falle eines eigenständigen Monatsnamens würden Sie jedoch Folgendes erwarten:

январь

Die richtige Lösung ist:

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

Wenn Sie daran interessiert sind, woher alle Übersetzungen stammen, finden Sie hier den Verweis auf gregorianische Kalenderübersetzungen (andere Kalender sind oben auf der Seite verlinkt).

artkoenig
quelle
'LLLL' ist nur seit Java 8 verfügbar. Sie können 'MMMM' mit SimpleDateFormat verwenden und es funktioniert auch einwandfrei für die Standalone-Version.
Juanheyns
23

So einfach ist das

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

Calendar.LONG gibt den vollständigen Namen des Monats an und Calendar.SHORT gibt den Namen kurz an. Zum Beispiel: Calendar.LONG gibt Januar zurück. Calendar.SHORT gibt Jan zurück

Sandale
quelle
Gute Antwort. Ich habe den Kalender selbst auf Alarm eingestellt und musste den Monatsnamen später abrufen. Perfekte Antwort. Danke
Ajji
10

Ich behalte diese Antwort, die für andere Fälle nützlich ist, aber die @ Wahrheitsantwort scheint der einfachste und direkteste Weg zu sein.

Sie können DateFormatSymbols verwenden

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

Die einzige Möglichkeit unter Android, einen richtig formatierten Stanalone-Monatsnamen für Sprachen wie Ukrainisch, Russisch und Tschechisch zu erhalten

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

Getestet auf API 15-25

Die Ausgabe für Mai ist йай, aber nicht Мая

Dmytro
quelle
3

Russisch.

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

май

Englisch in den Vereinigten Staaten.

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

Kann

Sehen Sie diesen Code live auf IdeOne.com .

ThreeTenABP und java.time

Hier ist die moderne Antwort. Als diese Frage im Jahr 2011 gestellt wurde Calendarund GregorianCalendarhäufig für Daten und Zeiten verwendet wurde, obwohl sie immer schlecht gestaltet waren. Das ist jetzt 8 Jahre her und diese Klassen sind längst veraltet. Angenommen, Sie befinden sich noch nicht auf API-Ebene 26, dann ist mein Vorschlag, die ThreeTenABP-Bibliothek zu verwenden, die einen an Android angepassten Backport von java.time enthält, der modernen Java-API für Datum und Uhrzeit. java.time ist so viel schöner zu arbeiten.

Abhängig von Ihren genauen Bedürfnissen und Ihrer Situation gibt es zwei Möglichkeiten:

  1. Verwendung Monthund ihre getDisplayNameMethode.
  2. Verwenden Sie a DateTimeFormatter.

Verwenden Sie Monat

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

Die Ausgabe dieses Snippets lautet:

Kann

In einigen Sprachen macht es einen Unterschied, ob Sie TextStyle.FULLoder verwenden TextStyle.FULL_STANDALONE. Sie müssen sehen, vielleicht mit Ihren Benutzern abklären, welcher der beiden in Ihren Kontext passt.

Verwenden Sie einen DateTimeFormatter

Wenn Sie ein Date mit oder ohne Tageszeit haben, finde ich ein DateTimeFormatterpraktischeres. Beispielsweise:

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

Ich zeige die Verwendung von a ZonedDateTime, dem nächstgelegenen Ersatz für die alte CalendarKlasse. Der obige Code wird für eine Arbeit LocalDate, eine LocalDateTime, MonthDay, OffsetDateTimeund ein YearMonthzu.

Was ist, wenn Sie eine Calendarvon einer Legacy-API erhalten haben, die noch nicht auf java.time aktualisiert wurde? In a konvertieren ZonedDateTimeund wie oben vorgehen:

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

Der Rest ist der gleiche wie zuvor.

Frage: Benötigt java.time nicht Android API Level 26?

java.time funktioniert sowohl auf älteren als auch auf neueren Android-Geräten. Es erfordert nur mindestens Java 6 .

  • In Java 8 und höher und auf neueren Android-Geräten (ab API-Level 26) ist die moderne API integriert.
  • In Nicht-Android Java 6 und 7 erhalten Sie den ThreeTen Backport, den Backport der modernen Klassen (ThreeTen für JSR 310; siehe die Links unten).
  • Verwenden Sie auf (älteren) Android die Android-Edition von ThreeTen Backport. Es heißt ThreeTenABP. Und stellen Sie sicher, dass Sie die Datums- und org.threeten.bpZeitklassen mit Unterpaketen importieren.

Links

Ole VV
quelle
2

Ich würde empfehlen, CalendarObjekt zu verwenden und Localeda Monatsnamen für verschiedene Sprachen unterschiedlich sind:

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

Beispiel für den vollständigen Monatsnamen:

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

Ergebnis: January

Beispiel für einen kurzen Monatsnamen:

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

Ergebnis: Jan

Ayaz Alifov
quelle
2

Ein Beispiel für die Ermittlung von Datum und Uhrzeit in diesem Format "2018 Nov 01 16:18:22"

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

Es ist überraschend schwierig, einen eigenständigen Monatsnamen in Java "richtig" auszuführen. (Zumindest zum jetzigen Zeitpunkt. Ich verwende derzeit Java 8).

Das Problem ist, dass sich in einigen Sprachen, einschließlich Russisch und Tschechisch, die eigenständige Version des Monatsnamens von der "Formatierungs" -Version unterscheidet. Es scheint auch, dass keine einzelne Java-API nur die "beste" Zeichenfolge liefert. Die meisten hier veröffentlichten Antworten bieten bisher nur die Formatierungsversion. Im Folgenden wird eine funktionierende Lösung zum Abrufen der eigenständigen Version eines einzelnen Monatsnamens oder zum Abrufen eines Arrays mit allen Namen eingefügt.

Ich hoffe das spart jemand anderem etwas Zeit!

/**
 * 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
quelle