Jak uzyskać nazwę miesiąca z kalendarza?

97

Czy istnieje oneliner, w którym można znaleźć nazwę miesiąca, o którym wiemy

int monthNumber = calendar.get(Calendar.MONTH)

Albo jaki jest najłatwiejszy sposób?

ogzd
źródło
3
@anyone_reaching_this_issue: To pytanie ( stackoverflow.com/questions/6192781/month-name-as-a-string ) wspomina o getDisplayName () i innych interesujących sztuczkach
Poutrathor

Odpowiedzi:

101

W ten sposób też otrzymasz.

  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
źródło
6
Implementacja DateFormatSymbols została zmieniona w JDK 8, więc metoda getMonths nie zwraca już poprawnych wartości dla wszystkich
ustawień
1
czy mógłbyś podać obejście / działające rozwiązanie dla JDK8?
Dominik
kiedy dostaniesz miesiąc jako liczbę?
Mickey Perlstein
Mickey, aby odpowiedzieć na twoje pytanie, oto jak uzyskać miesiąc jako int i użyć go - public static void main (String [] args) {int month; GregorianCalendar date = new GregorianCalendar (); miesiąc = data.get (kalendarz.MONTH); System.out.println ("Bieżący miesiąc to" + (miesiąc + 1) + ", a nazwa miesiąca to" + getMonthForInt (miesiąc)); } static String getMonthForInt (int num) {String month = "źle"; DateFormatSymbols dfs = new DateFormatSymbols (); String [] months = dfs.getMonths (); if (num> = 0 && num <= 11) {miesiąc = miesiące [liczba]; } miesiąc zwrotu; }
Ajay Kumar
193

można to osiągnąć za pomocą SimpleDateFormat , który służy do formatowania daty i czasu.

Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));
PermGenError
źródło
To zadziała, ale chciałbym uzyskać ciąg repr. miesiąca, w którym znam jego indeks. Myślę, że wykorzystam inne podejście, dzięki.
ogzd
47
pomogło mi to uzyskać nazwę bieżącego miesiąca. chociaż użyłem („MMMM”), aby uzyskać pełną nazwę miesiąca zamiast skróconej.
speedynomads
78

Tak proste

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
sandalon
źródło
4
Użycie abstrakcji kalendarza jest moim zdaniem najbardziej eleganckim rozwiązaniem. +1
sebastian
2
Źle! Problem będzie dotyczył języków z przypadkami. Na przykład w językach słowiańskich zwróci miesiąc w dopełniaczu, na przykład dla października w języku ru-RU otrzymasz октябряzamiast Октябрь, czego prawdopodobnie się spodziewasz.
Nick Sikrier
41

Oto rozwiązanie, które wymyśliłem dla projektu klasowego:

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

Podany numer pochodzi z Calendar.MONTHpołączenia.

Terry Chern
źródło
2
To jest dla mnie przydatnenew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani,
to jest słabe rozwiązanie, a co powiesz na styczeń, luty itp. nie dodatek do stycznia luty itp. to nie obejmie całej sytuacji
Abeer zaroor
2
Cóż, powinieneś dodać 1 do miesiąca. Tablice zaczynają się od 0
RoccoDev
to jest złe, wymyślasz na nowo Javę?
Mickey Perlstein
1
Działa to dla użytkowników mówiących po angielsku. Co z innymi?
Advait S
33

jeśli masz interfejs wielojęzyczny, możesz użyć getDisplayName do wyświetlenia nazwy miesiąca z kontrolą języka wyświetlania.

oto przykład wyświetlania nazwy miesiąca w języku angielskim, frensh, arabskim i arabskim w określonym kraju, takim jak „Syria”:

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

wynik to:

  January
  janvier
  يناير
  كانون الثاني
  Sat Jan 17 19:31:30 EET 2015
Inż. Samer T.
źródło
Która wersja Java to jest?
Muhammad Gelbana
16
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );

W przypadku niektórych języków (np. Rosyjskiego) jest to jedyny poprawny sposób uzyskania samodzielnych nazw miesięcy.

Oto, co otrzymujesz, jeśli używasz getDisplayNameod stycznia Calendarlub DateFormatSymbolsw styczniu:

января (co jest poprawne w przypadku pełnego ciągu daty: „ 10 января, 2014 ”)

ale w przypadku samodzielnej nazwy miesiąca można się spodziewać:

январь

artkoenig
źródło
Jest poprawną odpowiedzią dla języka RU. Bardzo dziwne, że Android SDK nie zawiera specyfikacji „LLLL”.
Anfet
12

Joda-Time

Co powiesz na używanie Joda-Time . Jest to znacznie lepsze API do pracy z datą i czasem (I Januaryoznacza tutaj styczeń. To nie jest jak Kalendarz, który używa 0-basedindeksu przez miesiące).

Możesz użyć AbstractDateTime#toString( pattern )metody, aby sformatować datę w określonym formacie:

DateTime date = DateTime.now();
String month = date.toString("MMM");

Nazwa miesiąca z numeru

Jeśli chcesz podać nazwę miesiąca dla konkretnego numeru miesiąca, możesz to zrobić w następujący sposób:

int month = 3;
String monthName = DateTime.now().withMonthOfYear(month).toString("MMM");

Zlokalizować

Powyższe podejście wykorzystuje bieżące domyślne ustawienia regionalne maszyny JVM dla języka nazwy miesiąca. Zamiast tego chcesz określić obiekt Locale.

String month = date.toString( "MMM", Locale.CANADA_FRENCH );
Rohit Jain
źródło
1
dzięki, ale jestem zadowolony z mojego starego SimpleDateFormatiDate
ogzd
@ogzd. Twoje życzenie. Ale powinieneś spróbować i założę się, że pokochasz to śpiewanie.
Rohit Jain
@ogzd. Opublikowałem sposób, aby uzyskać nazwę miesiąca od numeru miesiąca. Swoją drogą, dlaczego chcesz to zrobić?
Rohit Jain,
10

Month::getDisplayName

Od wersji Java 8 użyj Monthenum. PlikgetDisplayNameMetoda automatycznie lokalizuje nazwę miesiąca.

Przechodzić:

  • ZA TextStyle aby określić, jak długo lub w jakim skrócie.
  • A w Localecelu określenia ludzkiego języka używanego w tłumaczeniu oraz norm kulturowych używanych do skrótów, interpunkcji itp.

Przykład:

public static String getMonthStandaloneName(Month month) {
    return month.getDisplayName(
        TextStyle.FULL_STANDALONE, 
        Locale.getDefault()
    );
}
Nikolay Fedorovskikh
źródło
9

To może być stare pytanie, ale jako jeden liniowiec, aby uzyskać nazwę miesiąca, w którym znamy indeksy, użyłem

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

lub dla krótkich nazw

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

Pamiętaj, że Twój monthNumber zaczynasz liczyć od 1, podczas gdy którakolwiek z powyższych metod zwraca tablicę, więc musisz zacząć liczyć od 0.

George
źródło
3

Ten kod obsługuje języki. Użyłem ich w aplikacji na Androida.

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

String[] months = new DateFormatSymbols().getMonths();//January,Februaty,March,...
Samet ÖZTOPRAK
źródło
1
Działa to doskonale, chociaż komentarze są tylko trochę całkowicie błędne
Иво Недев
3

Znalazłem to znacznie łatwiej ( 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
źródło
nie Monthzaczyna indeksu od stycznia = 1, podczas gdy kalendarz zaczyna się od stycznia = 0? Nie Month.of(calendar.get(Calendar.MONTH));zawiódłby w przypadku stycznia?
MCO
2

Możesz to uzyskać w jednej linii w ten sposób: String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]

Whirvis
źródło
2

To działa dla mnie:

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

Aby powrócić "September"z jednym wierszem:

String month = getMonthName(9);
jhpg
źródło
2

Jednokierunkowa:

Mamy MonthAPI w Javie ( java.time.Month). Możemy uzyskać, używającMonth.of(month);

Tutaj Monthsą indeksowane jako liczby, więc możesz podać Month.JANUARYindeks lub podać indeks w powyższym API, taki jak 1, 2, 3, 4.

Drugi sposób:

ZonedDateTime.now().getMonth();

Jest to dostępne w java.time.ZonedDateTime.

kushal Baldev
źródło
1

Utworzyłem rozszerzenie kotlin na podstawie odpowiedzi w tym temacie i używając odpowiedzi DateFormatSymbols, otrzymujesz zlokalizowaną odpowiedź.

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
źródło
1

To zadziałało dla mnie

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


        Calendar cal = Calendar.getInstance();
        String currentdate=new SimpleDateFormat("dd-MMM").format(cal.getTime());
mahadev gouda
źródło
0
DateFormat date =  new SimpleDateFormat("dd/MMM/yyyy");
Date date1 = new Date();
System.out.println(date.format(date1));
Amit Mishra
źródło
1
Twoja odpowiedź może być poprawna, ale jest złej jakości. Opisz, dlaczego ta odpowiedź jest poprawna.
SubliemeSiem
1
@SubliemeSiem Po prostu próbuję zmienić format i najprostszy sposób, aby to zrobić: MM- zwróci nazwę miesiąca w postaci liczby całkowitej, takiej jak 01, 02, 03. MMM-zwróci nazwę miesiąca w skrócie, jak jan, feb, mar. MMMM - zwróci pełną nazwę miesiąca w formacie ciągowym, takim jak styczeń.
Amit Mishra
to jest jedyna PRAWIDŁOWA odpowiedź na formatowanie dat. użyj obiektu Date lub Calendar i sformatuj go za pomocą programu formatującego. samo pytanie brzmi ZŁE
Mickey Perlstein
0

Zwraca angielską nazwę miesiąca. 04 zwraca APRIL i tak dalej.

String englishMonth (int month){
        return Month.of(month);
    }
mxhc
źródło
Prosta i bezpośrednia sugestia, dzięki. Twój kod się nie kompiluje. Będziesz musiał zadeklarować zwracany typ Monthlub zastosować toStringsię do wyniku przed jego zwróceniem.
Ole VV
-3

z dokumentu SimpleDateFormat java:

*         <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
źródło
Nie rozumiem, jak ta odpowiedź na zadane pytanie.
jhpg,