DateFormat: сокращение месяца с точкой - PullRequest
6 голосов
/ 18 января 2011

У меня есть шаблон формата даты: MMM yyyy

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

Пример:

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

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

Ответы [ 2 ]

6 голосов
/ 18 января 2011

Я реализовал решение biziclop . - Работает.

Если кто-то заинтересован, вот оно:

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));
    }
}
6 голосов
/ 18 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...