Получите день как 1-е воскресенье, 2-й вторник - PullRequest
0 голосов
/ 04 июня 2019

Я хочу получить день (например, 1-е воскресенье, 2-й вторник) этого месяца в виде календаря. Как я могу добиться этого с помощью класса Calendar в Android? Спасибо.

1 Ответ

1 голос
/ 05 июня 2019

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 с подпакетами.

Ссылки

...