Локализованный формат даты без года с Joda Time

Я пытаюсь добиться показа даты в местном формате, но без года. Так должно быть:

  • 12 июня для Великобритании
  • 12 июня для США

Можно ли добиться с Йодой времени?

Мы пробовали шаблон "dd MMMM", но он не работает. Мы пробовали StringFormat.longDate() и лишить информацию о году, но есть ли более элегантное решение?

1 ответ

Решение

Под одеялом JodaTime использует JDK java.text.DateFormat.getDateInstance(int style, Locale aLocale) - увидеть источники org.joda.time.format.DateTimeFormat.StyleFormatter#getPattern(Locale locale) как он делегирует java.text.DateFormat:

String getPattern(Locale locale) {
    DateFormat f = null;
    switch (iType) {
        case DATE:
            f = DateFormat.getDateInstance(iDateStyle, locale);
            break;
        case TIME:
            f = DateFormat.getTimeInstance(iTimeStyle, locale);
            break;
        case DATETIME:
            f = DateFormat.getDateTimeInstance(iDateStyle, iTimeStyle, locale);
            break;
    }
    if (f instanceof SimpleDateFormat == false) {
        throw new IllegalArgumentException("No datetime pattern for locale: " + locale);
    }
    return ((SimpleDateFormat) f).toPattern();
}

поэтому форматы для отдельных языков встроены в JDK, даже в JodaTime.

Используя этот код, вы можете получить предопределенные шаблоны и выходные данные для разных локалей:

public static void main(String[] args) {
    DateTime dt = DateTime.now();

    String usFormat = DateTimeFormat.patternForStyle("L-", Locale.US);
    String ukFormat = DateTimeFormat.patternForStyle("L-", Locale.UK);

    System.out.println(dt.toString(usFormat));
    System.out.println(dt.toString(ukFormat));
}

печать

October 20, 2015
20 October 2015

Тем не менее, шаблоны предопределены только для четырех стилей: короткий, средний, длинный и полный, которые применяются для частей даты и времени отдельно. Смотрите JavaDoc DateTimeFormat#patternForStyle:

Первый символ - это стиль даты, а второй - стиль времени. Укажите символ 'S' для короткого стиля, 'M' для среднего, 'L' для длинного и 'F' для полного. Дата или время могут быть опущены, указав символ стиля '-'.

Поэтому, если вы хотите отбросить часть года, вам нужно будет обработать шаблон, полученный из DateTimeFormat.patternForStyle(), Это может быть сделано, например. удалив все символы "Y" и "y", но в целом, если вы хотите сделать это для произвольной локали, вы можете получить некоторые испорченные шаблоны.

Другие вопросы по тегам