Как отображать названия и номера дней с текущей даты в Android

Привет, я реализую функцию, называемую календарем. Теперь из текущего названия месяца и текущего года из этого, как отображать названия дней и номер дня.

Код:

cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            Date startDate = cal.getTime();
            cal.add(Calendar.DATE, 6);
            Date endDate = cal.getTime();

            Log.d(TAG, "Start Date = " + startDate);
            Log.d(TAG, "End Date = " + endDate);

Пример: Dec 2020

Ожидаемый результат:

Wed -9
Thu -10
Fri -11
Sat- 12
Sun- 13

Может ли кто-нибудь помочь мне Как достичь моей цели


person jyothi sri    schedule 09.12.2020    source источник
comment
К вашему сведению, вы используете ужасные классы даты и времени, которые несколько лет назад были вытеснены современными классами java.time, определенными в JSR 310.   -  person Basil Bourque    schedule 10.12.2020


Ответы (3)


Вы можете сделать это с помощью for цикла, объявленного с помощью

  1. Исходное значение на сегодня
  2. Конечное значение на конец месяца
  3. Увеличить значение за один день

и внутри тела цикла напечатайте трехбуквенное название дня недели (т.е. EEE) и день месяца (т.е. d) даты в формате DateTimeFormatter.ofPattern("EEE - d", Locale.ENGLISH).

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE - d", Locale.ENGLISH);
        LocalDate today = LocalDate.now();
        for (LocalDate date = today; !date.isAfter(today.with(TemporalAdjusters.lastDayOfMonth())); date = date
                .plusDays(1)) {
            System.out.println(date.format(formatter));
        }
    }
}

Вывод:

Fri - 11
Sat - 12
Sun - 13
...
...
...
Wed - 30
Thu - 31

Примечание: все даты этого месяца, начиная с сегодняшнего дня, состоят из двух цифр, поэтому не имеет значения, используете ли вы d или dd для дня месяца. Однако, если вам нужно всегда печатать день месяца двумя цифрами (например, 01 вместо 1), используйте dd в шаблоне DateTimeFormatter.


Некоторые полезные примечания:

API даты и времени java.util и их API форматирования SimpleDateFormat устарели и подвержены ошибкам. Рекомендуется полностью прекратить их использование и перейти на современный API даты и времени. Узнайте больше о современном API даты и времени на странице Trail: Date Time< /а>.

По какой-либо причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать ThreeTen-Backport, который переносит большую часть функций java.time на Java 6 и 7.

Если вы работаете над проектом Android и ваш уровень Android API по-прежнему не соответствует Java-8, проверьте Java 8+ API, доступные через дешугаринг и Как для использования ThreeTenABP в Android Project.

person Arvind Kumar Avinash    schedule 11.12.2020
comment
предположим, если сегодня вт, как изменить этот текст на сегодня - person jyothi sri; 15.12.2020
comment
@jyothisri - Нетрудно преобразовать день (например, Tue) в LocalDate, если вы знаете номер недели, например. Tue приходит каждую неделю, и если вы сообщите мне номер недели (например, 2-го числа Tue текущего месяца или что-то вроде Tue недели 49 года), я дам вам знать, как преобразовать Tue этой недели в LocalDate. Это то, что вы ищете что-то еще? - person Arvind Kumar Avinash; 15.12.2020
comment
Я хочу отображать вместо сегодняшнего имени как вт, а затем хочу отобразить сегодня - person jyothi sri; 16.12.2020
comment
@jyothisri - Для этого используйте System.out.println(date.equals(today) ? "Today - " + date.getDayOfMonth() : date.format(formatter));. Не стесняйтесь комментировать в случае каких-либо дальнейших запросов. - person Arvind Kumar Avinash; 16.12.2020

java.time и дешугаринг

Рассмотрите возможность использования java.time, современного API даты и времени Java, для работы с датами и календарем.

    DateTimeFormatter dayFormatter
            = DateTimeFormatter.ofPattern("EEE - ppd", Locale.ENGLISH);
    
    LocalDate currentDay = YearMonth.now(ZoneId.systemDefault()).atDay(1);
    LocalDate firstInNextMonth = currentDay.plusMonths(1);
    while (currentDay.isBefore(firstInNextMonth)) {
        System.out.println(currentDay.format(dayFormatter));
        currentDay = currentDay.plusDays(1);
    }

Вывод при запуске в декабре 2020 г. (выдержка):

Tue -  1
Wed -  2
Thu -  3
Fri -  4
Sat -  5
Sun -  6
Mon -  7
Tue -  8
Wed -  9
Thu - 10
Fri - 11
(--- cut ---)
Tue - 29
Wed - 30
Thu - 31

Для выровненного по правому краю дня месяца в распечатке я использовал ppd в строке шаблона формата. Для отображения в телефонном приложении вы можете предпочесть просто d.

Изменить: Для дней предстоящей недели инициализируйте даты следующим образом:

    LocalDate currentDay = LocalDate.now(ZoneId.systemDefault());
    LocalDate endDateExclusive = currentDay.plusWeeks(1);

При запуске кода в последнюю неделю месяца у вас могут быть включены дни следующего месяца, что, похоже, не согласуется с тем, что вы сказали: Сейчас с текущего названия месяца и текущего года…. Я надеюсь, что вы найдете удовлетворительное решение.

Вопрос: Разве для java.time не требуется Android API уровня 26?

java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6.

  • В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) современный API встроен.
  • В не-Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На более старых версиях Android используйте либо дешугаринг, либо версию ThreeTen Backport для Android. Он называется ThreeTenABP. В последнем случае убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

person Ole V.V.    schedule 10.12.2020
comment
Я получаю вывод, подобный этому, ср 2, чт 3, пт 4, пт 5, сб 6. Но я ожидаю от текущей недели: четверг 10, пт 11, сб 12, вс 13, это то, что я ожидаю - person jyothi sri; 10.12.2020
comment
Нет ожидаемого результата Я упоминал то же самое - person jyothi sri; 10.12.2020
comment
после дат хотите отобразить - person jyothi sri; 10.12.2020
comment
Я отредактировал и показал другой способ инициализации даты начала и окончания. Может быть, вы можете использовать это как вдохновение, чтобы найти способ получить то, что вы хотите. - person Ole V.V.; 11.12.2020

Это сделает работу.

public void printDaysOfMonth(int year, int month) {

    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat formatter = new SimpleDateFormat("EEE-d", Locale.ENGLISH);
    calendar.set(year, month, 1);
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    while (calendar.get(Calendar.MONTH) == month) {
        String fEndDate = formatter.format(calendar.getTime());
        System.out.println(fEndDate);
        calendar.add(Calendar.DATE, 1);
    }

}

Примечание. Январь-0 и декабрь-11

person akhil nair    schedule 09.12.2020
comment
Пожалуйста, не учите молодежь пользоваться давно устаревшим и заведомо проблемным классом SimpleDateFormat. По крайней мере, не в качестве первого варианта. И не без оговорок. Сегодня у нас намного лучше java.time, современный API даты и времени Java, и его DateTimeFormatter. Да, вы можете использовать его на Android. Для более старых версий Android см. раздел Как использовать ThreeTenABP в проекте Android. - person Ole V.V.; 10.12.2020