Настройка строковых элементов в формате даты (Java)

Java

Как настроить вывод названия месяца в родительном или именительном падеже?
Как настроить вывод короткого имени дня недели в верхнем регистре?
И другие вопросы настройки форматирования символов формата даты.

На первый вопрос ответ прост. Для именительного падежа названия месяца использовать в SimpleDateFormat шаблон «LLLL», а для родительного — «MMMM». (например «Декабрь» и «декабря» соответственно).

В общем случае, если не нравятся символы, используемые в DateFormat или SimpleDateFormat для представления названия месяца, дня недели, временной зоны и др., то их можно заменить на свои. Для этого нужно использовать DateFormatSymbols, который используется для их инкапсуляции непосредственно в DateFormat и SimpleDateFormat.

Следующие методы позволяют менять символы определенного типа. Назначение каждого метода явно следует из его названия.

  • public void setAmPmStrings(String[] newAmpms) – AM, PM
  • public void setEras(String[] newEras) – AD, BC
  • public 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:  ВС  ПН  ВТ  СР  ЧТ  ПТ  СБ  

ЧТ

Михаил Миронов

Живу в Нижнем Новгороде, работаю программистом с 2017 года, основная специализация Java, но также хорошо знаю PHP, Python, XML, HTML/CSS.

Добавить комментарий