So erhalten Sie den Monatsnamen aus dem Kalender

95

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?

ogzd
quelle
3
@anyone_reaching_this_issue: Diese Frage ( stackoverflow.com/questions/6192781/month-name-as-a-string ) erwähnt getDisplayName () und andere interessante Tricks
Poutrathor

Antworten:

99

Sie werden auch diesen Weg bekommen.

  String getMonthForInt(int num) {
        String month = "wrong";
        DateFormatSymbols dfs = new DateFormatSymbols();
        String[] months = dfs.getMonths();
        if (num >= 0 && num <= 11 ) {
            month = months[num];
        }
        return month;
    }
subodh
quelle
6
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; }
Ajay Kumar
192

Sie können dies mit SimpleDateFormat erreichen , mit dem Datum und Uhrzeit formatiert werden sollen.

Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));
PermGenError
quelle
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.
Speedynomads
77

So einfach ist das

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
Sandale
quelle
4
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:

public static String theMonth(int month){
    String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    return monthNames[month];
}

Die Nummer, die Sie übergeben, stammt aus einem Calendar.MONTHAnruf.

Terry Chern
quelle
2
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, new Locale("ar") ) );
    System.out.println(c.getDisplayName(Calendar.MONTH, Calendar.LONG, new Locale("ar", "SY") ) );
    System.out.println(c.getTime().toString());

Das Ergebnis ist:

  January
  janvier
  يناير
  كانون الثاني
  Sat Jan 17 19:31:30 EET 2015
Eng. Samer T.
quelle
Welche Java-Version ist das?
Muhammad Gelbana
16
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );

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 getDisplayNameab dem Calendaroder DateFormatSymbolsfü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:

январь

artkoenig
quelle
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).

Mit der AbstractDateTime#toString( pattern )Methode können Sie das Datum im angegebenen Format formatieren:

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.

String month = date.toString( "MMM", Locale.CANADA_FRENCH );
Rohit Jain
quelle
1
danke aber ich bin glücklich mit meinem alten SimpleDateFormatundDate
ogzd
@ogzd. Ihr Wunsch. Aber Sie sollten es unbedingt versuchen, und ich wette, Sie werden es lieben, es zu singen.
Rohit Jain
@ogzd. Ich habe den Weg gepostet, um den Monatsnamen von der Monatsnummer zu erhalten. Übrigens, warum sollten Sie das tun wollen?
Rohit Jain
10

Month::getDisplayName

Verwenden Sie seit Java 8 die MonthAufzählung. Die getDisplayNameMethode lokalisiert automatisch den Namen des Monats.

Bestehen:

  • A TextStyle, um zu bestimmen, wie lange oder wie abgekürzt.
  • A Locale, um die in der Übersetzung verwendete menschliche Sprache und die für Abkürzung, Interpunktion usw. verwendeten kulturellen Normen anzugeben.

Beispiel:

public static String getMonthStandaloneName(Month month) {
    return month.getDisplayName(
        TextStyle.FULL_STANDALONE, 
        Locale.getDefault()
    );
}
Nikolay Fedorovskikh
quelle
9

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

String month = new DateFormatSymbols().getMonths()[monthNumber - 1];

oder für Kurznamen

String month = new DateFormatSymbols().getShortMonths()[monthNumber - 1];

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.

Georger
quelle
3

Dieser Code unterstützt die Sprache. Ich hatte sie in der Android App verwendet.

String[] mons = new DateFormatSymbols().getShortMonths();//Jan,Feb,Mar,... 

String[] months = new DateFormatSymbols().getMonths();//January,Februaty,March,...
Samet ÖZTOPRAK
quelle
1
Dies funktioniert perfekt, die Kommentare sind nur ein kleines bisschen völlig falsch
Иво Недев
3

Ich fand das viel einfacher ( https://docs.oracle.com/javase/tutorial/datetime/iso/enum.html )

private void getCalendarMonth(Date date) {      
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    Month month = Month.of(calendar.get(Calendar.MONTH));       
    Locale locale = Locale.getDefault();
    System.out.println(month.getDisplayName(TextStyle.FULL, locale));
    System.out.println(month.getDisplayName(TextStyle.NARROW, locale));
    System.out.println(month.getDisplayName(TextStyle.SHORT, locale));
}
JibinNajeeb
quelle
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)]

Whirvis
quelle
2

Das funktioniert bei mir:

String getMonthName(int monthNumber) {
    String[] months = new DateFormatSymbols().getMonths();
    int n = monthNumber-1;
    return (n >= 0 && n <= 11) ? months[n] : "wrong number";
}

So kehren Sie "September"mit einer Zeile zurück:

String month = getMonthName(9);
jhpg
quelle
2

Einweg:

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.

Zweiter Weg:

ZonedDateTime.now().getMonth();

Dies ist verfügbar in java.time.ZonedDateTime.

kushal Baldev
quelle
1

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 = this
    return calendar
}


fun Date.getMonthName(): String {
    val month = toCalendar()[Calendar.MONTH]
    val dfs = DateFormatSymbols()
    val months = dfs.months
    return months[month]
}
Felipe Castilhos
quelle
1

Das hat bei mir funktioniert

        import java.text.SimpleDateFormat;
        import java.util.Calendar;


        Calendar cal = Calendar.getInstance();
        String currentdate=new SimpleDateFormat("dd-MMM").format(cal.getTime());
Mahadev Gouda
quelle
0
DateFormat date =  new SimpleDateFormat("dd/MMM/yyyy");
Date date1 = new Date();
System.out.println(date.format(date1));
Amit Mishra
quelle
1
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.

String englishMonth (int month){
        return Month.of(month);
    }
mxhc
quelle
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, 4 Jul 2001 12:08:56 -0700</code>
Rafael Sanches
quelle
Ich kann nicht sehen, wie diese die gestellte Frage beantwortet.
JHPG