Реализация DateFormatSymbols была изменена в JDK 8, поэтому метод getMonths больше не возвращает правильные значения для всех Locale: oracle.com/technetwork/java/javase/…
ahaaman
1
не могли бы вы дать обходной путь / рабочее решение для JDK8?
Доминик
когда вы получите месяц в виде числа?
Микки
Микки, чтобы ответить на ваш вопрос, вот как вы получаете месяц как int и используете его - public static void main (String [] args) {int month; Дата GregorianCalendar = новый GregorianCalendar (); месяц = date.get (Calendar.MONTH); System.out.println («Текущий месяц -« + (месяц + 1) + »и название месяца -« + getMonthForInt (месяц) »); } static String getMonthForInt (int num) {String month = "неверно"; DateFormatSymbols dfs = new DateFormatSymbols (); Строка [] месяцев = dfs.getMonths (); если (число> = 0 && число <= 11) {месяц = месяцы [число]; } месяц возврата; }
Аджай Кумар
194
вы можете добиться этого с помощью SimpleDateFormat , который предназначен для форматирования даты и времени.
Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));
На мой взгляд, использование абстракции Calendar - наиболее элегантное решение. +1
себастьян
2
Неправильно! Проблема будет в языках с падежами. Например, для славянских языков он вернет месяц в родительном падеже, например, для октября в локали ru-RU вы получите октябрявместо Октябрь, чего вы, вероятно, ожидаете.
Ник Сикриер
41
Это решение, которое я придумал для проекта класса:
Это полезно для меняnew SimpleDateFormat("MMMM").format(cal.getTime());
Pratik Butani
это слабое решение, как насчет января, февраля и т. д., а не дополнения к январю, февралю и т. д., это не покрывает всю ситуацию
Abeer zaroor
2
Что ж, вы должны добавить 1 к месяцу. Массивы начинаются с 0.
RoccoDev
1
Это работает для англоговорящих пользователей. А что насчет остальных?
Advait S
1
@MickeyPerlstein Нет. Это не «переизобретать» (как вы выразились) Java. И это тоже неплохо. Это просто способ сделать это. Кроме того, это основано на том, что вам не нужно использовать класс Calendar (или, по крайней мере, вам не нужно его использовать - хотя, если вам нужен текущий месяц, возможно, так), что может быть желательно в некоторых случаях. Конечно, это только для английского, но не в этом дело.
Прифтан,
33
если у вас многоязычный интерфейс, вы можете использовать getDisplayName для отображения названия месяца с контролем языка отображения.
вот пример отображения названия месяца на английском, французском, арабском и арабском языках в конкретной стране, такой как «Сирия»:
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());
результат:
January
janvier
يناير
كانون الثاني
Sat Jan 1719:31:30 EET 2015
Это правильный ответ для локали RU. Очень странно, что этот Android SDK не содержит спецификации LLLL.
Anfet
12
Джода-Тайм
Как насчет использования Joda-Time . Это гораздо лучший API для работы с датой и временем ( Januaryздесь имеется в виду январь. Это не похоже на Calendar, который использует 0-basedиндекс для месяцев).
Это может быть старый вопрос, но в качестве единого лайнера, чтобы узнать название месяца, когда мы знаем индексы, я использовал
String month = new DateFormatSymbols().getMonths()[monthNumber - 1];
или для коротких имен
String month = new DateFormatSymbols().getShortMonths()[monthNumber - 1];
Имейте monthNumberв виду, что вы начинаете отсчет с 1, в то время как любой из вышеперечисленных методов возвращает массив, поэтому вам нужно начать отсчет с 0.
Этот код имеет языковую поддержку. Я использовал их в приложении для Android.
String[] mons = new DateFormatSymbols().getShortMonths();//Jan,Feb,Mar,...
String[] months = new DateFormatSymbols().getMonths();//January,Februaty,March,...
не Monthначинает свой индекс с января = 1, тогда как календарь начинается с января = 0? Не Month.of(calendar.get(Calendar.MONTH));подведет в случае января?
MCO
2
Вы можете получить это одной строкой вот так:
String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]
Хотя ваш ответ может быть правильным, он плохого качества. Пожалуйста, поясните, почему этот ответ правильный.
SubliemeSiem
1
@SubliemeSiem Я просто пытаюсь изменить формат и самый простой способ сделать это: MM - он вернет название месяца в целых числах, например 01, 02, 03. MMM - он вернет название месяца вкратце, например, jan, feb, mar. MMMM - возвращает полное название месяца в строковом формате, например, январь.
Амит Мишра
это единственный ПРАВИЛЬНЫЙ ответ для форматирования дат. используйте объект Date или Calendar и отформатируйте его с помощью средства форматирования. вопрос сам по себе ПЛОХОЙ
Микки
0
Возвращает английское название месяца. 04 возвращает АПРЕЛЬ и так далее.
Простое и прямое предложение, спасибо. Ваш код не компилируется. Вам нужно будет либо объявить тип возвращаемого значения, Monthлибо применить toStringк результату перед его возвратом.
Ответы:
Вы получите и этот путь.
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; }
источник
вы можете добиться этого с помощью SimpleDateFormat , который предназначен для форматирования даты и времени.
Calendar cal = Calendar.getInstance(); System.out.println(new SimpleDateFormat("MMM").format(cal.getTime()));
источник
Так просто, как это
источник
октября
вместоОктябрь
, чего вы, вероятно, ожидаете.Это решение, которое я придумал для проекта класса:
public static String theMonth(int month){ String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; return monthNames[month]; }
Номер, который вы передаете, поступает по
Calendar.MONTH
телефону.источник
new SimpleDateFormat("MMMM").format(cal.getTime());
если у вас многоязычный интерфейс, вы можете использовать getDisplayName для отображения названия месяца с контролем языка отображения.
вот пример отображения названия месяца на английском, французском, арабском и арабском языках в конкретной стране, такой как «Сирия»:
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());
результат:
January janvier يناير كانون الثاني Sat Jan 17 19:31:30 EET 2015
источник
SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() ); dateFormat.format( date );
Для некоторых языков (например, русского) это единственный правильный способ получить отдельные названия месяцев.
Вот что вы получите, если используете
getDisplayName
отCalendar
илиDateFormatSymbols
для января:января (что правильно для полной строки даты: « 10 января 2014 »)
но в случае автономного названия месяца вы ожидаете:
январь
источник
Джода-Тайм
Как насчет использования Joda-Time . Это гораздо лучший API для работы с датой и временем (
January
здесь имеется в виду январь. Это не похоже на Calendar, который использует0-based
индекс для месяцев).Вы можете использовать
AbstractDateTime#toString( pattern )
метод для форматирования даты в указанном формате:DateTime date = DateTime.now(); String month = date.toString("MMM");
Название месяца из числа
Если вам нужно название месяца для определенного номера месяца, вы можете сделать это следующим образом:
int month = 3; String monthName = DateTime.now().withMonthOfYear(month).toString("MMM");
Локализовать
Приведенный выше подход использует текущий языковой стандарт JVM по умолчанию для языка названия месяца. Вместо этого вы хотите указать объект Locale.
String month = date.toString( "MMM", Locale.CANADA_FRENCH );
источник
SimpleDateFormat
иDate
Month::getDisplayName
Начиная с Java 8 используйте
Month
enum.getDisplayName
Метод автоматически локализует название месяца.Проходят:
TextStyle
чтобы определить, как долго или как сокращено.Locale
чтобы указать человеческий язык, используемый при переводе, и культурные нормы, используемые для сокращений, пунктуации и т. Д.Пример:
public static String getMonthStandaloneName(Month month) { return month.getDisplayName( TextStyle.FULL_STANDALONE, Locale.getDefault() ); }
источник
Это может быть старый вопрос, но в качестве единого лайнера, чтобы узнать название месяца, когда мы знаем индексы, я использовал
String month = new DateFormatSymbols().getMonths()[monthNumber - 1];
или для коротких имен
String month = new DateFormatSymbols().getShortMonths()[monthNumber - 1];
Имейте
monthNumber
в виду, что вы начинаете отсчет с 1, в то время как любой из вышеперечисленных методов возвращает массив, поэтому вам нужно начать отсчет с 0.источник
Этот код имеет языковую поддержку. Я использовал их в приложении для Android.
String[] mons = new DateFormatSymbols().getShortMonths();//Jan,Feb,Mar,... String[] months = new DateFormatSymbols().getMonths();//January,Februaty,March,...
источник
Мне это показалось намного проще ( 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)); }
источник
Month
начинает свой индекс с января = 1, тогда как календарь начинается с января = 0? НеMonth.of(calendar.get(Calendar.MONTH));
подведет в случае января?Вы можете получить это одной строкой вот так:
String monthName = new DataFormatSymbols.getMonths()[cal.get(Calendar.MONTH)]
источник
Это работает для меня:
String getMonthName(int monthNumber) { String[] months = new DateFormatSymbols().getMonths(); int n = monthNumber-1; return (n >= 0 && n <= 11) ? months[n] : "wrong number"; }
Чтобы вернуться
"September"
с одной строкой:String month = getMonthName(9);
источник
В одну сторону:
У нас есть
Month
API на Java (java.time.Month
). Мы можем получить, используяMonth.of(month);
Здесь
Month
они проиндексированы как числа, поэтому вы можете указатьMonth.JANUARY
или указать индекс в указанном выше API, например 1, 2, 3, 4.Второй способ:
Это доступно в формате
java.time.ZonedDateTime
.источник
Я создал расширение kotlin на основе ответов в этой теме и, используя ответы DateFormatSymbols, вы получите локализованный ответ.
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] }
источник
Это сработало для меня
import java.text.SimpleDateFormat; import java.util.Calendar; Calendar cal = Calendar.getInstance(); String currentdate=new SimpleDateFormat("dd-MMM").format(cal.getTime());
источник
DateFormat date = new SimpleDateFormat("dd/MMM/yyyy"); Date date1 = new Date(); System.out.println(date.format(date1));
источник
Возвращает английское название месяца. 04 возвращает АПРЕЛЬ и так далее.
String englishMonth (int month){ return Month.of(month); }
источник
Month
либо применитьtoString
к результату перед его возвратом.из java-документа 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>
источник