Получите день, как 1-е воскресенье, 2-й вторник

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


person CauCuKien    schedule 04.06.2019    source источник
comment
Что ты уже испробовал ?   -  person twenk11k    schedule 04.06.2019
comment
Вы можете использовать java.text.SimpleDateFormat, чтобы получить формат   -  person Rahul Khurana    schedule 04.06.2019
comment
См. этот stackoverflow.com/questions/39528331/   -  person Naitik Soni    schedule 04.06.2019
comment
@RahulKhurana SimpleDateFormat общеизвестно хлопотный и давно устарел. И хотя он может дать вам 1 Sunday и 2 Tuesday, я не думаю, что он может дать вам 1st Sunday и 2nd Tuesday с порядковыми индикаторами.   -  person Ole V.V.    schedule 05.06.2019


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

Ссылки

person Ole V.V.    schedule 05.06.2019