Как настроить вывод названия месяца в родительном или именительном падеже?
Как настроить вывод короткого имени дня недели в верхнем регистре?
И другие вопросы настройки форматирования символов формата даты.
На первый вопрос ответ прост. Для именительного падежа названия месяца использовать в SimpleDateFormat шаблон «LLLL», а для родительного — «MMMM». (например «Декабрь» и «декабря» соответственно).
В общем случае, если не нравятся символы, используемые в DateFormat или SimpleDateFormat для представления названия месяца, дня недели, временной зоны и др., то их можно заменить на свои. Для этого нужно использовать DateFormatSymbols, который используется для их инкапсуляции непосредственно в DateFormat и SimpleDateFormat.
Следующие методы позволяют менять символы определенного типа. Назначение каждого метода явно следует из его названия.
public void setAmPmStrings(String[] newAmpms)
– AM, PMpublic void setEras(String[] newEras)
– AD, BCpublic void setMonths(String[] newMonths)
– ЯНВАРЬ, ФЕВРАЛЬ, …public void setShortMonths(String[] newShortMonths)
– ЯНВ, ФЕВ, …public void setWeekdays(String[] newWeekdays)
– Понедельник, Вторник, …public void setShortWeekdays(String[] newShortWeekdays)
– Пн, Вт, …public void setZoneStrings(String[][] newZoneStrings)
Каждому методу соответствует свой геттер, возвращающий текущий установленный набор символов.
При составлении массива строк для имен месяцев стоит помнить, что индекс для месяца 0-11 (т.е. январь – 0, а декабрь – 11). Чтобы не запутаться при индексировании строк для недели желательно использовать константы Calendar.SUNDAY
, Calendar.MONDAY
и т.д., поскольку Воскресенье имеет индекс 1, понедельник – 2 и т.д.
Обособленно идет часовой пояс, поскольку для инкапсуляции символов используется двумерный массив размера NxM. Где каждая из N строк содержит запись об отдельном часовом поясе. Для каждого i с 0 по N-1:
zoneStrings[i][0]
– идентификатор часового пояса (не локализуется а используется один из действительных идентификаторов из класса TimeZone)zoneStrings[i][1]
– полное название часового поясаzoneStrings[i][2]
– сокращенное название часового поясаzoneStrings[i][3]
– Полное название часового пояса в летнее времяzoneStrings[i][4]
– Сокращенное название часового пояса в летнее время
Пример:
Как изменить вывод короткого имени дня недели с нижнего регистра в верхний?
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class DateFormatSymbolsDemo {
public static void main(String[] args) {
Date today;
String result;
SimpleDateFormat formatter;
DateFormatSymbols symbols;
String[] defaultDays;
String[] modifiedDays;
symbols = new DateFormatSymbols(Locale.getDefault());
defaultDays = symbols.getShortWeekdays();
System.out.print("defaultDays:");
for(String str: defaultDays) {
System.out.print(str + " ");
}
System.out.println();
String[] capitalDays = {
"", "ВС", "ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ"};
symbols.setShortWeekdays(capitalDays);
modifiedDays = symbols.getShortWeekdays();
System.out.print("modifiedDays:");
for(String str: modifiedDays) {
System.out.print(str + " ");
}
formatter = new SimpleDateFormat("E ", symbols);
today = new Date();
result = formatter.format(today);
System.out.println("\n\n"+result);
}
}
Результирующий вывод
defaultDays: Вс Пн Вт Ср Чт Пт Сб
modifiedDays: ВС ПН ВТ СР ЧТ ПТ СБ
ЧТ