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.