#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 );
для макс.