开发者

DateFormat: month abbreviation with dot

I have a date format pattern: MMM yyyy

And want that: if the month name is short cuted a dot is printed after the name. But if the month name is not short cuted no dot is added.

Example:

  • May 2010 should print: May 2010 (without dot) -- May is only 3 letters long, so there is no dot needed, because it is not an abbreviation.
  • December 2100 should print: Dec. 2010 (with dot) -- December is more than 3 letters long, so there is a dot needed, because it an abbreviation.

Is this possi开发者_如何学Pythonble with an pattern, or do I need to implement it by "hand"?


What you can do is use a custom DateFormatSymbols in your formatter, in which you override the short months array with one that contains "May" instead of "May.".

Update: Sorry, I got the last bit wrong, of course it should be the other way around, short months are originally "Jan", "Feb" etc and you should replace them with "Jan.", "Feb." for every month except for May.


I have implemented biziclop solution. -- It works.

If anyone is interessted in, here it is:

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));
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜