Получите видимый пользователю текст для дня недели (правильный язык), используя номер day_of_week из календаря Java

У меня есть число, представляющее день недели (например, непосредственно из константы Calendar.MONDAY). Теперь я хотел бы получить видимый пользователю текст того дня (используя локаль моего мобильного телефона по умолчанию для правильного перевода). У меня еще нет экземпляра Calendar, только номер!

В настоящее время я использую приведенный ниже код, но мне кажется, что это должно быть проще или, по крайней мере, без создания полного экземпляра Calendar (но я не нахожу способа легко установить день_недели на дату).

private String LOCALE = Locale.getDefault();
private String FORMAT_DAY_OF_WEEK = "EEEE";

public convertDayOfWeekFromNumberToText(int dayOfWeekNumber) {
  Calendar cal = Calendar.getInstance(LOCALE);
  cal.set(Calendar.DAY_OF_WEEK, dayOfWeekNumber);
  return new SimpleDateFormat(FORMAT_DAY_OF_WEEK, LOCALE).format(cal.getTime());
}

Это действительно самый простой способ получить текст? И есть ли лучшее решение, если вы хотите получить максимальную производительность?

пс. если решения Java7 и Java8 отличаются, укажите оба.

Изменить

Благодаря комментариям John16384 @ я нашел лучшее решение (см. ответ). Я преобразовал util-метод, описанный выше, в 2 разных метода (1 для короткого и 1 для длинного формата). Дополнительные решения все равно будут оценены!


person P Kuijpers    schedule 10.04.2017    source источник


Ответы (2)


Лучшее решение, которое я нашел, это:

DateFormatSymbols.getInstance(LOCALE).getWeekdays()[dayOfWeek]

или в зависимости от формата:

DateFormatSymbols.getInstance(LOCALE).getShortWeekdays()[dayOfWeek]

Не идеальное решение при работе с переменным форматом, но у меня пока работает (при использовании только 2-х форматов). Любые дополнительные советы по-прежнему приветствуются!

person P Kuijpers    schedule 10.04.2017

Если вы используете Java 8, рассмотрите возможность использования нового java. API времени. Это проще, меньше ошибок и менее подвержено ошибкам, чем старые API .

Если вы используете Java ‹= 7, вы можете использовать ThreeTen Backport, отличный бэкпорт для новых классов даты/времени Java 8. А для Android есть ThreeTenABP (подробнее о том, как его использовать здесь).

Код ниже работает для обоих. Единственная разница заключается в именах пакетов (в Java 8 — java.time, а в ThreeTen Backport (или ThreeTenABP для Android) — org.threeten.bp), но имена классов и методов одинаковы.

Вы можете использовать DayOfWeek и получить соответствующий текст в любой локали:

int dayOfWeek = 1;
// get day of week from 1 (Monday) to 7 (Sunday)
DayOfWeek dow = DayOfWeek.of(dayOfWeek);
// get value in specified locale
System.out.println(dow.getDisplayName(TextStyle.FULL, Locale.getDefault()));
System.out.println(dow.getDisplayName(TextStyle.SHORT, Locale.getDefault()));
System.out.println(dow.getDisplayName(TextStyle.NARROW, Locale.getDefault()));

Предполагая, что языковой стандарт по умолчанию английский, вывод будет таким:

Понедельник
Пн
М

Вы можете изменить приведенный выше код на любой Locale, который вам нужен.


Calendar.DAY_OF_WEEK имеет значения от 1 (воскресенье) до 7 (суббота), но DayOfWeek нового API использует значения от 1 (понедельник) до 7 (воскресенье). Итак, чтобы преобразовать одно в другое, вам нужно настроить значения:

int d = calendar.get(Calendar.DAY_OF_WEEK);
// convert values for day of week
int dayOfWeek = (d - 1 == 0) ? 7 : d - 1;
// get day of week from 1 (Monday) to 7 (Sunday)
DayOfWeek dow = DayOfWeek.of(dayOfWeek);
person Community    schedule 07.08.2017