2011-01-18 4 views
6

У меня есть шаблон формата даты: MMM yyyyDateFormat: месяц аббревиатура с точкой

И хочу, чтобы: если название месяца коротка вырезан точка печатается после названия. Но если название месяца не является сокращенным, точка не добавляется.

Пример:

  • мая 2010 должен напечатать: May 2010 (без точки) - мая только 3 буквы длинные, так что нет точки нужно, потому что это не аббревиатура.
  • Декабрь 2100 должен печатать: Dec. 2010 (с точкой) - декабрь длиной более 3 букв, поэтому требуется точка, потому что это аббревиатура.

Возможно ли это с рисунком, или мне нужно его реализовать «рукой»?

ответ

6

Что вы можете сделать, это использовать пользовательский DateFormatSymbols в вашем форматировании, в котором вы переопределяете массив коротких месяцев с тем, который содержит «May» вместо «May».

Обновление: Извините, я получил последнее немного неправильно, конечно, должно быть наоборот, короткие месяцы изначально «Ян», «Фев» и т. Д., И вы должны заменить их на «Янв», «февраль» за каждый месяц, за исключением мая.

6

Я реализовал biziclop solution. -- Оно работает.

Если кто-то interessted в, здесь:

import static org.junit.Assert.assertEquals; 

import java.text.DateFormat; 
import java.text.DateFormatSymbols; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.Locale; 

import org.junit.Test; 

public class DateFormatTest { 

    /** The locale where the tests are for. */ 
    private static final Locale locale = Locale.ENGLISH; 

    /** 
    * Add a dot to all abbricated short months. 
    * 
    * @param dateFormatSymbols 
    * @return 
    */ 
    private final DateFormatSymbols addDotToAbbricationMonths(final DateFormatSymbols dateFormatSymbols) { 

     String[] shortMonths = dateFormatSymbols.getShortMonths(); 
     for (int i = 0; i < shortMonths.length; i++) { 
      if (dateFormatSymbols.getMonths()[i].length() > shortMonths[i].length()) { 
       shortMonths[i] += '.'; 
      } 
     } 
     dateFormatSymbols.setShortMonths(shortMonths); 

     return dateFormatSymbols; 
    } 

    /** pattern under test. */ 
    final DateFormat format = new SimpleDateFormat("MMM yyyy", addDotToAbbricationMonths(new DateFormatSymbols(locale))); 

    /** Scenario: May is only 3 letters long, so there is no dot needed, because it is not an abbreviation. */ 
    @Test 
    public void testShortEnought() { 
     Date firstMay = new GregorianCalendar(2010, Calendar.MAY, 1).getTime(); 

     assertEquals("May 2010", format.format(firstMay)); 
    } 

    /** Scenario: December is more than 3 letters long, so there is a dot needed, because it an abbreviation. */ 
    @Test 
    public void testToLong() { 
     Date firstDecember = new GregorianCalendar(2010, Calendar.DECEMBER, 1).getTime(); 

     assertEquals("Dec. 2010", format.format(firstDecember)); 
    } 

    /** Scenario: if the DateFormatSymbols are changed for this special, it should not influence the other formatter. */ 
    @Test 
    public void noInfluence() { 
     Date firstDecember = new GregorianCalendar(2010, Calendar.DECEMBER, 1).getTime(); 

     assertEquals("Dec 2010", new SimpleDateFormat("MMM yyyy", locale).format(firstDecember)); 
    } 
} 
Смежные вопросы