java.time и ThreeTenABP
Редактировать: Элегантное решение использует DateTimeFormatter
:
Locale language = Locale.ENGLISH;
Map<Long, String> ordinalNumber = new HashMap<>(8);
ordinalNumber.put(1L, "1st");
ordinalNumber.put(2L, "2nd");
ordinalNumber.put(3L, "3rd");
ordinalNumber.put(4L, "4th");
ordinalNumber.put(5L, "5th");
DateTimeFormatter dayFormatter = new DateTimeFormatterBuilder()
.appendText(ChronoField.ALIGNED_WEEK_OF_MONTH, ordinalNumber)
.appendPattern(" EEEE 'of the month'")
.toFormatter(language);
LocalDate date = LocalDate.now(ZoneId.of("Pacific/Auckland"));
String dayString = date.format(dayFormatter);
System.out.println("" + date + " is the " + dayString);
Когда я только что запустил этот фрагмент, он вывел:
2019-06-05 - 1-я среда месяца
Очевидно, что вы можете указать любую дату, какую пожелаете, кроме сегодняшней даты в Новой Зеландии.
Концепция выровненной недели месяца определяет первую неделю месяца как дни с 1 по 7, 2-ю неделю с 8 по 14 и т. Д. Поэтому, когда среда соответствует неделе 1 согласно этой схеме, мы также знаем, что это должна быть первая среда месяца. Тот же аргумент для других чисел.
Я не использую класс Calendar
, который вы упомянули, так как он плохо спроектирован и давно устарел. Вместо этого я использую java.time, современный Java-интерфейс даты и времени.
Оригинальный код (немного короче, но, тем не менее, немного больше ручной работы):
String[] ordinalNumber = { "0th", "1st", "2nd", "3rd", "4th", "5th" };
LocalDate date = LocalDate.now(ZoneId.of("Pacific/Auckland"));
DayOfWeek day = date.getDayOfWeek();
int numberDowOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH);
String dayString = String.format(language, "%s %s of the month",
ordinalNumber[numberDowOfMonth],
day.getDisplayName(TextStyle.FULL_STANDALONE, language));
System.out.println("" + date + " is the " + dayString);
Вывод такой же, как указано выше.
В моем массиве ordinalNumber
есть неиспользуемый 0-й элемент. Я поместил его туда только потому, что массивы в Java основаны на 0, и я хотел, чтобы другие строки были выровнены с числами.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time прекрасно работает на старых и новых устройствах Android. Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) встроен современный API.
- В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старых) Android используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки