Я хочу получить день (например, 1-е воскресенье, 2-й вторник) этого месяца в качестве календаря. Как я могу добиться этого с помощью календаря класса в Android? Спасибо.
Получите день, как 1-е воскресенье, 2-й вторник
Ответы (1)
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, вторую неделю — с 8 по 14 и т. д. Таким образом, когда среда находится на неделе 1 в соответствии с этой схемой, мы также знаем, что она должна быть 1-я среда месяца. Тот же аргумент для других чисел.
Я не использую упомянутый вами класс Calendar
, так как он плохо спроектирован и давно устарел. Вместо этого я использую java.time, современный API даты и времени 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 используйте версию ThreeTen Backport для Android. Он называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки
- учебное пособие по Oracle: дата и время, объясняющее, как использовать java.time.
- Запрос спецификации Java (JSR) 310, где впервые было описано
java.time
. - Проект ThreeTen Backport, бэкпорт
java.time
на Java 6 и 7 (ThreeTen для JSR-310). - ThreeTenABP, версия ThreeTen Backport для Android
- Вопрос: как использовать ThreeTenABP в проекте Android, с очень тщательным объяснение.
SimpleDateFormat
общеизвестно хлопотный и давно устарел. И хотя он может дать вам1 Sunday
и2 Tuesday
, я не думаю, что он может дать вам1st Sunday
и2nd Tuesday
с порядковыми индикаторами. - person Ole V.V.   schedule 05.06.2019