Локализованный формат даты без года с 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", но в целом, если вы хотите сделать это для произвольной локали, вы можете получить некоторые испорченные шаблоны.