Gibt es einen Oneliner, um den Namen des Monats zu erhalten, wenn wir es wissen int monthNumber = calendar.get(Calendar.MONTH)? Oder was ist der einfachste Weg?
Die Implementierung von DateFormatSymbols wurde in JDK 8 geändert, sodass die Methode getMonths nicht mehr für alle Gebietsschemas die richtigen Werte zurückgibt
ahaaman
1
Können Sie eine Problemumgehung / Arbeitslösung für JDK8 angeben?
Dominik
Wann würden Sie einen Monat als Nummer bekommen?
Mickey Perlstein
Mickey, um Ihre Frage zu beantworten, hier ist, wie Sie Monat als int erhalten und verwenden - public static void main (String [] args) {int month; GregorianCalendar date = new GregorianCalendar (); month = date.get (Calendar.MONTH); System.out.println ("Aktueller Monat ist" + (Monat + 1) + "und Monatsname ist" + getMonthForInt (Monat)); } static String getMonthForInt (int num) {String month = "false"; DateFormatSymbols dfs = new DateFormatSymbols (); String [] month = dfs.getMonths (); if (num> = 0 && num <= 11) {month = month [num]; } return month; }
Dies wird funktionieren, aber ich möchte den String repr bekommen. des Monats, in dem ich den Index kenne. Ich denke, ich werde die anderen Ansätze verwenden, danke.
ogzd
47
Dies half mir, den aktuellen Monatsnamen zu erhalten. obwohl ich ("MMMM") verwendet habe, um den vollständigen Monatsnamen anstelle eines verkürzten zu erhalten.
Die Verwendung der Kalenderabstraktion ist meiner Meinung nach die eleganteste Lösung. +1
Sebastian
2
Falsch! Das Problem wird in Sprachen mit Fällen sein. In slawischen Gebietsschemas wird beispielsweise im Genitiv ein Monat zurückgegeben, z. B. für den Oktober in einem ru-RU-Gebietsschema , das Sie октябряstattdessen erhalten Октябрь, was Sie wahrscheinlich erwarten.
Nick Sikrier
41
Dies ist die Lösung, die ich für ein Klassenprojekt gefunden habe:
Dies ist nützlich für michnew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani
Dies ist eine schwache Lösung, wie wäre es mit Jan, Februar usw. nicht zusätzlich zu Januar Februar usw. Dies wird nicht die gesamte Situation
abdecken
2
Nun, Sie sollten 1 zum Monat hinzufügen. Arrays beginnen von 0.
RoccoDev
das ist schlecht, du erfindest java neu?
Mickey Perlstein
1
Dies funktioniert für englischsprachige Benutzer. Was ist mit den anderen?
Advait S
32
Wenn Sie über eine mehrsprachige Benutzeroberfläche verfügen, können Sie mit getDisplayName den Namen des Monats anzeigen und die Anzeige der Sprache steuern.
Hier ist ein Beispiel für die Anzeige des Monatsnamens in Englisch, Französisch, Arabisch und Arabisch in einem bestimmten Land wie "Syrien":
Calendar c =Calendar.getInstance();System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,Locale.ENGLISH ));System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,Locale.FRANCE ));System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,newLocale("ar")));System.out.println(c.getDisplayName(Calendar.MONTH,Calendar.LONG,newLocale("ar","SY")));System.out.println(c.getTime().toString());
Das Ergebnis ist:
January
janvier
ينايركانونالثانيSatJan1719:31:30 EET 2015
Ist eine korrekte Antwort für das Gebietsschema von RU. Sehr seltsam, dass das Android SDK keine 'LLLL'-Spezifikation enthält.
Anfet
12
Joda-Zeit
Wie wäre es mit Joda-Time . Es ist eine weitaus bessere Datums- / Uhrzeit-API (und Januarybedeutet hier Januar. Es ist nicht wie Kalender, der verwendet0-based Index monatelang verwendet wird).
DateTime date =DateTime.now();String month = date.toString("MMM");
Monatsname von Nummer
Wenn Sie einen Monatsnamen für eine bestimmte Monatsnummer wünschen, können Sie dies folgendermaßen tun:
int month =3;String monthName =DateTime.now().withMonthOfYear(month).toString("MMM");
Lokalisieren
Der obige Ansatz verwendet das aktuelle Standardgebietsschema Ihrer JVM für die Sprache des Monatsnamens. Sie möchten stattdessen ein Gebietsschemaobjekt angeben.
Bitte beachten Sie, dass Ihre monthNumberZählung ab 1 beginnt, während eine der oben genannten Methoden ein Array zurückgibt, sodass Sie mit der Zählung ab 0 beginnen müssen.
nicht Monthstartet seinen Index mit Januar = 1, während Kalender beginnt mit Januar = 0? Würde Month.of(calendar.get(Calendar.MONTH));im Januar nicht scheitern?
MCO
2
Sie können es eine Zeile wie folgt bekommen:
String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]
Wir haben MonthAPI in Java ( java.time.Month). Wir können mit bekommenMonth.of(month);
Hier Monthwerden die als Zahlen indiziert, sodass Sie entweder Month.JANUARYeinen Index in der obigen API wie 1, 2, 3, 4 oder einen Index in dieser bereitstellen können.
Ich habe eine Kotlin-Erweiterung basierend auf den Antworten in diesem Thema erstellt. Mit den DateFormatSymbols-Antworten erhalten Sie eine lokalisierte Antwort.
fun Date.toCalendar():Calendar{
val calendar =Calendar.getInstance()
calendar.time =thisreturn calendar
}
fun Date.getMonthName():String{
val month = toCalendar()[Calendar.MONTH]
val dfs =DateFormatSymbols()
val months = dfs.months
return months[month]}
Ihre Antwort mag zwar richtig sein, ist aber von schlechter Qualität. Bitte erläutern Sie, warum diese Antwort richtig ist.
SubliemeSiem
1
@SubliemeSiem Ich versuche nur, das Format und den einfachsten Weg zu ändern: MM - es wird den Monatsnamen in einer Ganzzahl wie 01, 02, 03 zurückgeben. MMM - es wird kurz den Monatsnamen wie jan, feb, mar zurückgeben. MMMM-it gibt den vollständigen Monatsnamen im Zeichenfolgenformat wie Januar zurück.
Amit Mishra
Dies ist die einzige RICHTIGE Antwort für die Formatierung von Daten. Verwenden Sie ein Datums- oder Kalenderobjekt und formatieren Sie es mit einem Formatierer. Die Frage selbst ist schlecht
Mickey Perlstein
0
Es gibt den englischen Namen des Monats zurück. 04 gibt APRIL zurück und so weiter.
Einfacher und direkter Vorschlag, danke. Ihr Code wird nicht kompiliert. Sie müssen entweder den Rückgabetyp deklarieren Monthoder toStringauf das Ergebnis anwenden , bevor Sie es zurückgeben.
Ole VV
-3
aus dem Java-Dokument SimpleDateFormat:
*<td><code>"yyyyy.MMMMM.dd GGG hh:mm aaa"</code>*<td><code>02001.July.04 AD 12:08 PM</code>*<td><code>"EEE, d MMM yyyy HH:mm:ss Z"</code>*<td><code>Wed,4Jul200112:08:56-0700</code>
Antworten:
Sie werden auch diesen Weg bekommen.
quelle
Sie können dies mit SimpleDateFormat erreichen , mit dem Datum und Uhrzeit formatiert werden sollen.
quelle
So einfach ist das
quelle
октября
stattdessen erhaltenОктябрь
, was Sie wahrscheinlich erwarten.Dies ist die Lösung, die ich für ein Klassenprojekt gefunden habe:
Die Nummer, die Sie übergeben, stammt aus einem
Calendar.MONTH
Anruf.quelle
new SimpleDateFormat("MMMM").format(cal.getTime());
Wenn Sie über eine mehrsprachige Benutzeroberfläche verfügen, können Sie mit getDisplayName den Namen des Monats anzeigen und die Anzeige der Sprache steuern.
Hier ist ein Beispiel für die Anzeige des Monatsnamens in Englisch, Französisch, Arabisch und Arabisch in einem bestimmten Land wie "Syrien":
Das Ergebnis ist:
quelle
Für einige Sprachen (z. B. Russisch) ist dies der einzig richtige Weg, um die eigenständigen Monatsnamen zu erhalten.
Folgendes erhalten Sie, wenn Sie
getDisplayName
ab demCalendar
oderDateFormatSymbols
für Januar verwenden:января (was für eine vollständige Datumszeichenfolge korrekt ist: " 10 января, 2014 ")
Im Falle eines eigenständigen Monatsnamens würden Sie jedoch Folgendes erwarten:
январь
quelle
Joda-Zeit
Wie wäre es mit Joda-Time . Es ist eine weitaus bessere Datums- / Uhrzeit-API (und
January
bedeutet hier Januar. Es ist nicht wie Kalender, der verwendet0-based
Index monatelang verwendet wird).Mit der
AbstractDateTime#toString( pattern )
Methode können Sie das Datum im angegebenen Format formatieren:Monatsname von Nummer
Wenn Sie einen Monatsnamen für eine bestimmte Monatsnummer wünschen, können Sie dies folgendermaßen tun:
Lokalisieren
Der obige Ansatz verwendet das aktuelle Standardgebietsschema Ihrer JVM für die Sprache des Monatsnamens. Sie möchten stattdessen ein Gebietsschemaobjekt angeben.
quelle
SimpleDateFormat
undDate
Month::getDisplayName
Verwenden Sie seit Java 8 die
Month
Aufzählung. DiegetDisplayName
Methode lokalisiert automatisch den Namen des Monats.Bestehen:
TextStyle
, um zu bestimmen, wie lange oder wie abgekürzt.Locale
, um die in der Übersetzung verwendete menschliche Sprache und die für Abkürzung, Interpunktion usw. verwendeten kulturellen Normen anzugeben.Beispiel:
quelle
Es mag eine alte Frage sein, aber als Einzeiler, um den Namen des Monats zu erhalten, in dem wir die Indizes kennen, habe ich verwendet
oder für Kurznamen
Bitte beachten Sie, dass Ihre
monthNumber
Zählung ab 1 beginnt, während eine der oben genannten Methoden ein Array zurückgibt, sodass Sie mit der Zählung ab 0 beginnen müssen.quelle
Dieser Code unterstützt die Sprache. Ich hatte sie in der Android App verwendet.
quelle
Ich fand das viel einfacher ( https://docs.oracle.com/javase/tutorial/datetime/iso/enum.html )
quelle
Month
startet seinen Index mit Januar = 1, während Kalender beginnt mit Januar = 0? WürdeMonth.of(calendar.get(Calendar.MONTH));
im Januar nicht scheitern?Sie können es eine Zeile wie folgt bekommen:
String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]
quelle
Das funktioniert bei mir:
So kehren Sie
"September"
mit einer Zeile zurück:quelle
Einweg:
Wir haben
Month
API in Java (java.time.Month
). Wir können mit bekommenMonth.of(month);
Hier
Month
werden die als Zahlen indiziert, sodass Sie entwederMonth.JANUARY
einen Index in der obigen API wie 1, 2, 3, 4 oder einen Index in dieser bereitstellen können.Zweiter Weg:
Dies ist verfügbar in
java.time.ZonedDateTime
.quelle
Ich habe eine Kotlin-Erweiterung basierend auf den Antworten in diesem Thema erstellt. Mit den DateFormatSymbols-Antworten erhalten Sie eine lokalisierte Antwort.
quelle
Das hat bei mir funktioniert
quelle
quelle
Es gibt den englischen Namen des Monats zurück. 04 gibt APRIL zurück und so weiter.
quelle
Month
odertoString
auf das Ergebnis anwenden , bevor Sie es zurückgeben.aus dem Java-Dokument SimpleDateFormat:
quelle