Ошибка Java Android: текущий месяц не может быть после конца месяца

#java #android

#java #Android

Вопрос:

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

У меня есть способ построения ограничений:

 public CalendarConstraints.Builder setCalendarConstraints() {
    CalendarConstraints.Builder constraints = new CalendarConstraints.Builder();

    long min = setMinDate();
    long max = setMaxDate();

    constraints.setStart(min);
    constraints.setEnd(max);

    return constraints;
}
 

И два следующих метода используются для получения минимальной и максимальной дат:

 // Maximum date for the date picker is the current date   1 month
public long setMaxDate() {
    LocalDate now = LocalDate.now();
    LocalDate max;

    if (now.getMonthValue() == 12) {
        max = LocalDate.of(now.getYear(), 1, now.getDayOfMonth());
        max.plusYears(1);
    } else {
        max = LocalDate.of(now.getYear(), now.getMonth().plus(1), now.getDayOfMonth());
    }
    return max.atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli();
}
 

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

java.lang.Исключение IllegalArgumentException: текущий месяц не может быть после окончания месяца

Комментарии:

1. Может ли это быть связано с ошибкой, указанной здесь? github.com/material-components/material-components-android /…

2. Совет: ваш существующий код завершится ошибкой, когда текущий момент наступит около полуночи. Ваши два вызова могут непреднамеренно захватить две разные даты. Вместо этого запишите текущую дату перед вашими двумя вызовами и передайте дату в качестве аргумента.

Ответ №1:

Классы java.time используют неизменяемые объекты.

Метод LocalDate::plusYears() не работает сам по LocalDate себе. Как говорит Javadoc, он возвращает новый объект, копию исходного LocalDate объекта, но с добавлением одного года.

Поэтому вам нужно будет написать:

  max = max.plusYears(1);
 

Кстати, вам не нужно проверять декабрь.

 LocalDate max = LocalDate.now().plusMonths(1)
 

делает трюк, находитесь ли вы в декабре или нет.

Ответ №2:

попробуйте

 LocalDate.now().plusMonths( 1 );
 

для макс.