10 ответов:
import java.text.DateFormatSymbols; public String getMonth(int month) { return new DateFormatSymbols().getMonths()[month-1]; }
вы должны использовать LLLL для автономных имен месяцев. это задокументировано в
SimpleDateFormatдокументации, например:SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() ); dateFormat.format( date );
Я бы использовал SimpleDateFormat. Кто-то поправит меня, если есть более простой способ сделать месячный календарь, хотя я делаю это в коде сейчас, и я не так уверен.
import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public String formatMonth(int month, Locale locale) { DateFormat formatter = new SimpleDateFormat("MMMM", locale); GregorianCalendar calendar = new GregorianCalendar(); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.MONTH, month-1); return formatter.format(calendar.getTime()); }
вот как я бы это сделал. Я оставлю диапазон проверки на
int monthдо вас.import java.text.DateFormatSymbols; public String formatMonth(int month, Locale locale) { DateFormatSymbols symbols = new DateFormatSymbols(locale); String[] monthNames = symbols.getMonths(); return monthNames[month - 1]; }
С Помощью SimpleDateFormat.
import java.text.SimpleDateFormat; public String formatMonth(String month) { SimpleDateFormat monthParse = new SimpleDateFormat("MM"); SimpleDateFormat monthDisplay = new SimpleDateFormat("MMMM"); return monthDisplay.format(monthParse.parse(month)); } formatMonth("2");Результат: Февраля
видимо в Android 2.2 есть ошибка с SimpleDateFormat.
чтобы использовать названия месяцев, вы должны сами определить их в своих ресурсах:
<string-array name="month_names"> <item>January</item> <item>February</item> <item>March</item> <item>April</item> <item>May</item> <item>June</item> <item>July</item> <item>August</item> <item>September</item> <item>October</item> <item>November</item> <item>December</item> </string-array>а затем использовать их в коде следующим образом:
/** * Get the month name of a Date. e.g. January for the Date 2011-01-01 * * @param date * @return e.g. "January" */ public static String getMonthName(Context context, Date date) { /* * Android 2.2 has a bug in SimpleDateFormat. Can't use "MMMM" for * getting the Month name for the given Locale. Thus relying on own * values from string resources */ String result = ""; Calendar cal = Calendar.getInstance(); cal.setTime(date); int month = cal.get(Calendar.MONTH); try { result = context.getResources().getStringArray(R.array.month_names)[month]; } catch (ArrayIndexOutOfBoundsException e) { result = Integer.toString(month); } return result; }
java.время
начиная с Java 1.8 (или 1.7 & 1.6 с ThreeTen-Backport) вы можете использовать это:
Month.of(integerMonth).getDisplayName(TextStyle.FULL_STANDALONE, locale);отметим, что
integerMonthявляется 1-based, т. е. 1 для января. Диапазон всегда от 1 до 12 для января-декабря (т. е. только по Григорианскому календарю).
tl; dr
Month.of( yourMonthNumber ) .getDisplayName( TextStyle.SHORT_STANDALONE , new Locale( "es" , "MX" ) )
java.time.Monthгораздо проще сделать сейчас в java.классы времени, которые вытесняют эти неприятные старые устаревшие классы даты-времени.
The
Monthперечисление определяет десятка объектов, по одному на каждый месяц.месяцы пронумерованы 1-12 за январь-декабрь.
Month month = Month.of( 2 ); // 2 → February.попросите объект сгенерировать строку название месяца, автоматически локализованы.
изменить
TextStyleчтобы указать, как долго или сокращенное наименование. Обратите внимание, что в некоторых языках (не английском) название месяца изменяется, если используется отдельно или как часть полной даты. Таким образом, каждый стиль текста имеет…_STANDALONEвариант.указать
Localeопределить:
- какой человеческий язык следует использовать в переводе.
- какие культурные нормы должны решать такие вопросы, как сокращение, пунктуация и заглавные буквы.
пример:
Locale l = new Locale( "es" , "MX" ); String output = Month.FEBRUARY.getDisplayName( TextStyle.SHORT_STANDALONE , l ); // Or Locale.US, Locale.CANADA_FRENCH.
имя →
MonthобъектFYI, идя в другом направлении (разбор строки имени месяца, чтобы получить
Monthперечисление объекта) не является встроенным. Вы можете написать свой собственный класс, чтобы сделать это. Вот моя быстрая попытка такого класса. используйте на свой страх и риск. Я не дал этому коду ни серьезной мысли, ни какой-либо серьезной тестирование.использование.
Month m = MonthDelocalizer.of( Locale.CANADA_FRENCH ).parse( "janvier" ) ; // Month.JANUARYкод.
package com.basilbourque.example; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.time.Month; import java.time.format.TextStyle; import java.util.ArrayList; import java.util.List; import java.util.Locale; // For a given name of month in some language, determine the matching `java.time.Month` enum object. // This class is the opposite of `Month.getDisplayName` which generates a localized string for a given `Month` object. // Usage… MonthDelocalizer.of( Locale.CANADA_FRENCH ).parse( "janvier" ) → Month.JANUARY // Assumes `FormatStyle.FULL`, for names without abbreviation. // About `java.time.Month` enum: https://docs.oracle.com/javase/9/docs/api/java/time/Month.html // USE AT YOUR OWN RISK. Provided without guarantee or warranty. No serious testing or code review was performed. public class MonthDelocalizer { @NotNull private Locale locale; @NotNull private List < String > monthNames, monthNamesStandalone; // Some languages use an alternate spelling for a “standalone” month name used without the context of a date. // Constructor. Private, for static factory method. private MonthDelocalizer ( @NotNull Locale locale ) { this.locale = locale; // Populate the pair of arrays, each having the translated month names. int countMonthsInYear = 12; // Twelve months in the year. this.monthNames = new ArrayList <>( countMonthsInYear ); this.monthNamesStandalone = new ArrayList <>( countMonthsInYear ); for ( int i = 1 ; i <= countMonthsInYear ; i++ ) { this.monthNames.add( Month.of( i ).getDisplayName( TextStyle.FULL , this.locale ) ); this.monthNamesStandalone.add( Month.of( i ).getDisplayName( TextStyle.FULL_STANDALONE , this.locale ) ); } // System.out.println( this.monthNames ); // System.out.println( this.monthNamesStandalone ); } // Constructor. Private, for static factory method. // Personally, I think it unwise to default implicitly to a `Locale`. But I included this in case you disagree with me, and to follow the lead of the *java.time* classes. --Basil Bourque private MonthDelocalizer ( ) { this( Locale.getDefault() ); } // static factory method, instead of constructors. // See article by Dr. Joshua Bloch. http://www.informit.com/articles/article.aspx?p=1216151 // The `Locale` argument determines the human language and cultural norms used in de-localizing input strings. synchronized static public MonthDelocalizer of ( @NotNull Locale localeArg ) { MonthDelocalizer x = new MonthDelocalizer( localeArg ); // This class could be optimized by caching this object. return x; } // Attempt to translate the name of a month to look-up a matching `Month` enum object. // Returns NULL if the passed String value is not found to be a valid name of month for the human language and cultural norms of the `Locale` specified when constructing this parent object, `MonthDelocalizer`. @Nullable public Month parse ( @NotNull String input ) { int index = this.monthNames.indexOf( input ); if ( - 1 == index ) { // If no hit in the contextual names, try the standalone names. index = this.monthNamesStandalone.indexOf( input ); } int ordinal = ( index + 1 ); Month m = ( ordinal > 0 ) ? Month.of( ordinal ) : null; // If we have a hit, determine the `Month` enum object. Else return null. if ( null == m ) { throw new java.lang.IllegalArgumentException( "The passed month name: ‘" + input + "’ is not valid for locale: " + this.locale.toString() ); } return m; } // `Object` class overrides. @Override public boolean equals ( Object o ) { if ( this == o ) return true; if ( o == null || getClass() != o.getClass() ) return false; MonthDelocalizer that = ( MonthDelocalizer ) o; return locale.equals( that.locale ); } @Override public int hashCode ( ) { return locale.hashCode(); } public static void main ( String[] args ) { // Usage example: MonthDelocalizer monthDelocJapan = MonthDelocalizer.of( Locale.JAPAN ); try { Month m = monthDelocJapan.parse( "pink elephant" ); // Invalid input. } catch ( IllegalArgumentException e ) { // … handle error System.out.println( "ERROR: " + e.getLocalizedMessage() ); } // Ignore exception. (not recommended) if ( MonthDelocalizer.of( Locale.CANADA_FRENCH ).parse( "janvier" ).equals( Month.JANUARY ) ) { System.out.println( "GOOD - In locale "+Locale.CANADA_FRENCH+", the input ‘janvier’ parses to Month.JANUARY." ); } } }
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как
java.util.Date,Calendar,&SimpleDateFormat.в Joda-Time, теперь режим обслуживания, советует миграция в java.время классы.
дополнительные сведения см. В разделе элемент Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте - драйвера совместимый с JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в
java.sql.*классы.где получить java.время занятий?
- Java SE 8, Java SE 9, и позже
- встроенный.
- часть стандартного Java API с комплектной реализацией.
- Java 9 добавляет некоторые незначительные функции и зафиксировать.
- Java SE 6 и Java SE 7
- большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport.
- Android
- более поздние версии Android bundle реализации java.время занятия.
- для более ранних Android ( ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как
Interval,YearWeek,YearQuarterи больше.
существует проблема, когда вы используете класс DateFormatSymbols для его метода getMonthName, чтобы получить месяц по имени он показывает месяц по номеру в некоторых устройствах Android. Я решил эту проблему, сделав так:
В String_array.xml
<string-array name="year_month_name"> <item>January</item> <item>February</item> <item>March</item> <item>April</item> <item>May</item> <item>June</item> <item>July</item> <item>August</item> <item>September</item> <item>October</item> <item>November</item> <item>December</item> </string-array>в классе Java просто вызовите этот массив следующим образом:
public String[] getYearMonthName() { return getResources().getStringArray(R.array.year_month_names); //or like //return cntx.getResources().getStringArray(R.array.month_names); } String[] months = getYearMonthName(); if (i < months.length) { monthShow.setMonthName(months[i] + " " + year); }Удачи В Кодировании :)
public static void main(String[] args) { SimpleDateFormat format = new SimpleDateFormat("MMMMM", new Locale("en", "US")); System.out.println(format.format(new Date())); }
Comments