Jak uzyskać nazwę miesiąca z kalendarza?


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

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

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

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.


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

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ć:

январь


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

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

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.


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,...

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

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


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

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.


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]
}

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

0
DateFormat date =  new SimpleDateFormat("dd/MMM/yyyy");
Date date1 = new Date();
System.out.println(date.format(date1));

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

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>

Nie rozumiem, jak ta odpowiedź na zadane pytanie.
jhpg,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.