2015-11-18 2 views
0

Я пытаюсь преобразовать int month to month name (string). Я использую простой формат даты, но я получаю только «Ян» на все месяцы. почему это происходит?Невозможно преобразовать int month to month name android java

public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { 

     String sdf = new SimpleDateFormat("LLL", Locale.getDefault()).format(monthOfYear); 

    String date = +dayOfMonth+" "+(sdf); 
    dateTextView.setText(date); 
+1

Возможный дубликат [Как преобразовать целое число в локализованное имя месяца в Java?] (Http://stackoverflow.com/questions/1038570/how-can-i-convert-an-integer-to-localized- month-in-java) –

ответ

4

я получаю только «Ян» для всех месяцев

Поскольку String sdf = new SimpleDateFormat("LLL", Locale.getDefault()).format(monthOfYear); здесь, monthOfYear это номер объекта так, DateFormate класс преобразует его в Date объект из этого числа, которое будет находиться в диапазоне от 1 Jan, 1970 до 12 Jan, 1970 так что вы всегда получаете Яна на весь месяц.

Try,

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.MONTH, monthOfYear); 
sdf = new SimpleDateFormat("LLL", Locale.getDefault()).format(calendar.getTime()); 

or 

sdf = new DateFormatSymbols().getShortMonths()[monthOfYear]; 

DateFormat фрагмент кода:

 /** 
    * Formats the specified object as a string using the pattern of this date 
    * format and appends the string to the specified string buffer. 
    * <p> 
    * If the {@code field} member of {@code field} contains a value specifying 
    * a format field, then its {@code beginIndex} and {@code endIndex} members 
    * will be updated with the position of the first occurrence of this field 
    * in the formatted text. 
    * 
    * @param object 
    *   the source object to format, must be a {@code Date} or a 
    *   {@code Number}. If {@code object} is a number then a date is 
    *   constructed using the {@code longValue()} of the number. 
    * @param buffer 
    *   the target string buffer to append the formatted date/time to. 
    * @param field 
    *   on input: an optional alignment field; on output: the offsets 
    *   of the alignment field in the formatted text. 
    * @return the string buffer. 
    * @throws IllegalArgumentException 
    *   if {@code object} is neither a {@code Date} nor a 
    *   {@code Number} instance. 
    */ 
    @Override 
    public final StringBuffer format(Object object, StringBuffer buffer, FieldPosition field) { 
     if (object instanceof Date) { 
      return format((Date) object, buffer, field); 
     } 
     if (object instanceof Number) { 
      return format(new Date(((Number) object).longValue()), buffer, field); 
     } 
     throw new IllegalArgumentException("Bad class: " + object.getClass()); 
    } 
+0

Ницца! Я не знал о классе DateFormatSymbols. Очень удобно. Я думаю, вы хотите 'getShortMonths()', хотя. –

+1

@MikeM Вы правы getShortMonths() - правильный метод для использования в данном конкретном случае. –

+0

Это сработало отлично. Спасибо. – spykeburn

2

SimpleDateFormat#format() метод имеет перегрузку, которая принимает Object, поэтому вы сможете пройти int к нему. Однако это не тот метод, который вы хотите. Вы хотите, чтобы тот, который принимает Date объект, который мы можем получить от Calendar с соответствующим месяц набора:

private String getMonthAbbr(int monthOfYear) { 
    Calendar c = Calendar.getInstance(); 
    c.set(Calendar.MONTH, monthOfYear); 
    return new SimpleDateFormat("LLL").format(c.getTime()); 
} 

Passing Locale.getDefault() является излишним в этом случае, как это то, что SimpleDateFormat будет использовать, если не указано иное ,

0

Т.Л., д-р

Month.of(yourMonthNumber).getDisplayName(TextStyle.SHORT_STANDALONE , Locale.CANADA_FRENCH) 

java.time.Month

Намного проще сделать сейчас в классах java.time что вытеснить эти неприятные старые устаревшие классы времени.

Month enum определяет дюжину объектов, по одному на каждый месяц.

Промежуточные месяцы 1-12 за январь-декабрь.

Month month = Month.of(2); // 2 → February. 

Задайте объект для создания строки из name of the month, automatically localized. Отрегулируйте TextStyle, чтобы указать, как долго или сокращенно вы хотите получить имя. Укажите Locale, чтобы сказать, какой человеческий язык следует использовать в переводе и какие культурные нормы должны решать такие вопросы, как аббревиатура, пунктуация и капитализация.

String output = Month.FEBRUARY.getDisplayName(TextStyle.SHORT_STANDALONE , Locale.CANADA_FRENCH); 

О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые классы времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial.И поиск Stack Overflow для многих примеров и объяснений.

Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport и дополнительно выполнен с возможностью Android в ThreeTenABP (см How to use…).

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и другие.

Смежные вопросы