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()));
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:
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).
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.
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,...
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)]
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.
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.
Odpowiedzi:
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; }
źródło
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()));
źródło
Tak proste
źródło
октября
zamiastОктябрь
, czego prawdopodobnie się spodziewasz.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.MONTH
połączenia.źródło
new SimpleDateFormat("MMMM").format(cal.getTime());
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
źródło
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
getDisplayName
od styczniaCalendar
lubDateFormatSymbols
w styczniu:января (co jest poprawne w przypadku pełnego ciągu daty: „ 10 января, 2014 ”)
ale w przypadku samodzielnej nazwy miesiąca można się spodziewać:
январь
źródło
Joda-Time
Co powiesz na używanie Joda-Time . Jest to znacznie lepsze API do pracy z datą i czasem (I
January
oznacza tutaj styczeń. To nie jest jak Kalendarz, który używa0-based
indeksu 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 );
źródło
SimpleDateFormat
iDate
Month::getDisplayName
Od wersji Java 8 użyj
Month
enum. PlikgetDisplayName
Metoda automatycznie lokalizuje nazwę miesiąca.Przechodzić:
TextStyle
aby określić, jak długo lub w jakim skrócie.Locale
celu 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() ); }
źródło
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.źródło
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,...
źródło
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)); }
źródło
Month
zaczyna indeksu od stycznia = 1, podczas gdy kalendarz zaczyna się od stycznia = 0? NieMonth.of(calendar.get(Calendar.MONTH));
zawiódłby w przypadku stycznia?Możesz to uzyskać w jednej linii w ten sposób:
String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]
źródło
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);
źródło
Jednokierunkowa:
Mamy
Month
API w Javie (java.time.Month
). Możemy uzyskać, używającMonth.of(month);
Tutaj
Month
są indeksowane jako liczby, więc możesz podaćMonth.JANUARY
indeks lub podać indeks w powyższym API, taki jak 1, 2, 3, 4.Drugi sposób:
Jest to dostępne w
java.time.ZonedDateTime
.źródło
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] }
źródło
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());
źródło
DateFormat date = new SimpleDateFormat("dd/MMM/yyyy"); Date date1 = new Date(); System.out.println(date.format(date1));
źródło
Zwraca angielską nazwę miesiąca. 04 zwraca APRIL i tak dalej.
String englishMonth (int month){ return Month.of(month); }
źródło
Month
lub zastosowaćtoString
się do wyniku przed jego zwróceniem.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>
źródło